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
ointer):Boolean;stdcall;
function Go(hwnd:THandle;Param
ointer):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
ointer):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
ointer):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)吗?