运行非DELPHI程序后,如何激活它,并在它上面操作(200分)

  • 主题发起人 主题发起人 xiaotian
  • 开始时间 开始时间
X

xiaotian

Unregistered / Unconfirmed
GUEST, unregistred user!
当我用WINEXEC()调用一个程序后,却无法激活它,另外还相在上面输入字符什么的,,咋办?
 
WINEXEC的最后一个参数设为SW_SHOWNORMAL
 
我要的是让它自动成为激活的窗口,WINDOWS不是只允许有一个窗口激活吗?
 
用SW_Show调用后就是激活的。
另:最好用32位的调用:ShellExecute
 
是 小天 么?
 
同意Crab ,最好用32位的调用:ShellExecute ,uses shellapi

 
我用了sw_normal也可以,呵,但是怎么自动取得那个软件的菜单的控制权,比如说按ALT-f打开FILE菜单,我给这150分..
 
我写过一个为FOXMAIL增强功能的东东,就是为FOXMAIL的窗口增加一个菜单项,并进行控制的东
东。其中主菜单的控制可以使用GetMenu来得到,至于子菜单的单的话可以先用GetSubMenu得到
其句柄,然后再通过发送WM_COMMAND消息的方法来执行其功能。说得笼统了下结,细节问题您可
以具体举例我们一起来交流。
 
刚才我实验了一下,该窗口是自动激活的,而且按ALT-f是可以打开FILE菜单的:
WinExec('C:/Program Files/Winamp/WINAMP.exe',SW_SHOWNORMAL);
 
我说的是自动按ALT f,不是再用人工,在此先谢过刘了,都问得我不好意思了,我会
另外给你分的,不管你能不能解答,
WJIACHUN:我就是小天,很高兴能认识你们。
李广?:先让我试试你的方法,比如说我打开NOTEPAD。EXE;然后再自动按ALT——S,
打开搜索菜单,然后再自动按F打开查找,在上面自动输入DEPHI,然后自动按查找键
哦,我只是说用这样的方法,请不要帮我另外找个更方便的,呵。。
 
先用shellexecute启动程序,
然后用findwindow找到程序的句柄,
再向其发键盘消息.
 
to 小天:
按照你所说的步骤我写了一个DEMO。该程序适应于WIN98上的记事本程序。以前我也曾经试过向
程序主界面发按键激活菜单项的方法,但是却一直没有成功,想必可能菜单快捷键用的消息响应
是一种独特的机制吧,由于下的方法可以解决问题,所以我也就有没继续研究。这个问题如果您
知道的话,那么不妨拿出来,让我们大家知道知道。
unit ligwin1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
function FullText(hwnd:THandle;Param:Pointer):Boolean;stdcall;
function Go(hwnd:THandle;Param:Pointer):Boolean;stdcall;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
h:HWND;
m:HMENU;
begin
h:=FindWindow('Notepad',nil);
if h<>0 then
begin
SetForegroundWindow(h);//先将其摆到前台,以使效果明显一些。
m:=GetMenu(h);//取主菜单句柄
m:=GetSubMenu(m,2);//取搜索菜单句柄
//SendMessage(h,WM_INITMENUPOPUP,s,0);//如果菜单有运行时所建立的项,
//或者Checked等,先执行一下这句,让其先在不知不觉中做下一操作。
SendMessage(h,WM_COMMAND,MakeLong(GetMenuItemId(m,0),0),GetSubMenu(m,0));
//其中通过GetMenuItemId和GetSubMenu分别取得查找菜单的ID和句柄,这是WM_COMMAND
//事件所要用到的。执行完这行就已经能够看到记事本的查找窗口了。
h:=GetForegroundWindow;
EnumChildWindows(h,@FullText,0);
//向查找窗口的编辑框添加要查找的文本。由于前面已经将记事本窗口摆到前台,所以这个
//时候查找窗口应该成为当前窗口,所以直接用GetForegroundWindow,前台窗口即可,如果
//你不确定当时的前台窗口是查找窗口的话,那么可以使用FindWindow来查找该窗口。
EnumChildWindows(h,@Go,0);
end
else
MessageBox(Handle,'请运行一个记事本的实例!','提示信息',MB_OK);
end;

function FullText(hwnd:THandle;Param:Pointer):Boolean;stdcall;
var
buffer:array[0..255] of char;
begin
GetClassName(hwnd,buffer,255);
if buffer='Edit' then
begin
StrCopy(buffer,'DELPHI');
SendMessage(hwnd,WM_SETTEXT,0,Integer(@buffer));
Result:=false;
end
else
Result:=true;
end;

function Go(hwnd:THandle;Param:Pointer):Boolean;stdcall;
var
buffer:array[0..255] of char;
begin
Result:=true;
GetClassName(hwnd,buffer,255);
if buffer='Button' then
begin
GetWindowText(hwnd,buffer,254);
if buffer='查找下一个(&F)' then
begin
SendMessage(hwnd,BM_CLICK,0,0);
Result:=false;
end;
end;
end;

end.
这个方法虽然可以完成工作,但是其局限性却是比较大,说不定基于的软件一改版本你的程序很
可能就要从写(这样也好,可以向用户再次收取一定的升级费用:->)。
顺便问句,你是以前大富翁论坛上的那个小天MM(OR JJ)吗?
 
ROU,能否说得更详细点呢,关于键盘消息方面的,比如说ALT-F,该如何输入哩。。
 
问题变了?!不过我也想知道。。。
 
不好意思,休息了一长段时间,前几天刚找到的,只要加上这两句就可以了:
keybd_event(byte(vk_menu),mapvirtualkey(byte(vk_menu),2),0,0);
keybd_event(byte(vk_menu),mapvirtualkey(byte(vk_menu),2),keyeventf_keyup,0);
keybd_event(byte('F'),mapvirtualkey(byte('F'),2),0,0);
keybd_event(byte('F'),mapvirtualkey(byte('F'),2),keyeventf_keyup,0);
就相当于按ALT—F;
TO LIGUANG:谢谢了,以前我是有用小天注册过,但可不是你的什么MMJJ的,可能是另有其
人吧。。
 
多人接受答案了。
 
后退
顶部