如何获取另一程序的菜单项的名字并点击它? ( 积分: 50 )

  • 主题发起人 主题发起人 mr.hl
  • 开始时间 开始时间
M

mr.hl

Unregistered / Unconfirmed
GUEST, unregistred user!
我要做的一个小程序是
获取一个外部程序的菜单(就是那个程序的 MainMenu)的第0,0项的名字,然后反复点击它,直到他的caption值变化了.
问题是那个菜单的第一项按下后,这个项会变成不可用,要等这个外部程序反应后,才会重新变成可用状态,我的目的是只要他的caption为"登录",就一直让我的程序按这个按钮,直到他的caption不为"登录"为止.
我现在所收集到的语句如下,请高手帮忙!
50 不成敬意 :)
procedure TForm1.Button1Click(Sender: TObject);
var
HWindow, : THandle;buffer: array [0..128] of Char;
begin
HWindow := FindWindow(nil, 'Dr.COM 用户认证程序 (v3.22)');//最好这里能用进程名或他的 PID 来获得句柄,但是我不知道怎么办,高手教教我
if HWindow <> 0 then
begin
buffer := '登录';
while buffer = '登录' do
begin
PostMessage(HWindow, WM_COMMAND, GetMenuItemID(GetMenu(HWindow), 0), 0);//如果 GetMenuItemID(GetMenu(HWindow), 0) 为不可用,while好像就直接跳出来了.
GetMenuString(GetMenu(HWindow), 0, @buffer, sizeof(buffer), MF_BYPOSITION);//这个是取这个菜单项的名字到buffer里.
end;

我有个笨办法就是sleep个1秒,怎么才能弄成不管这个菜单项是不是可用,都一直点它???
 
还有个笨办法就是使用 timer
有更好的方法吗???
 
procedure TForm1.Button1Click(Sender: TObject);
var
HWindow, : THandle;buffer: array [0..128] of Char;
begin
HWindow := FindWindow(nil, 'Dr.COM 用户认证程序 (v3.22)');//最好这里能用进程名或他的 PID 来获得句柄,但是我不知道怎么办,高手教教我
if HWindow <> 0 then
begin
buffer := '登录';
while buffer = '登录' do
begin
EnableWindow(HWindow, True);
PostMessage(HWindow, WM_COMMAND, GetMenuItemID(GetMenu(HWindow), 0), 0);//如果 GetMenuItemID(GetMenu(HWindow), 0) 为不可用,while好像就直接跳出来了.
GetMenuString(GetMenu(HWindow), 0, @buffer, sizeof(buffer), MF_BYPOSITION);//这个是取这个菜单项的名字到buffer里.
end;
 
楼上你好,我发现问题并不是出现在没有 EnableWindow(HWindow, True); 这句
也不是我说的 PostMessage(HWindow, WM_COMMAND, GetMenuItemID(GetMenu(HWindow), 0), 0);//如果 GetMenuItemID(GetMenu(HWindow), 0) 为不可用,while好像就直接跳出来了. 其实获得菜单名跟菜单是否Enable无关.

而是 while buffer = '登录' do 这句.
buffer 始终是不会等于 '登录' 的,buffer 是个数组. buffer 是 '','',#215,#162,#207,#250,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,#0,...(为什么前面会有两个'','',呢???)
用 strpas(buffer) 得到的字符串后面有一堆 #0 ,所以不会等于 '登录'
怎么把数组里的字符连成一个字符串而不要后面的一堆 #0 ?
 
为什么没人回答了啊?
我这样 strpas(@buffer[2]) 处理了.
有更好的办法吗?高手帮帮忙啊!
 
procedure TForm1.Button1Click(Sender: TObject);
var
HWindow, : THandle;buffer: string;
begin
SetLength(buffer, MAX_PATH + 1);
HWindow := FindWindow(nil, 'Dr.COM 用户认证程序 (v3.22)');//最好这里能用进程名或他的 PID 来获得句柄,但是我不知道怎么办,高手教教我
if HWindow <> 0 then
begin
buffer := '登录';
while buffer = '登录' do
begin
EnableWindow(HWindow, True);
PostMessage(HWindow, WM_COMMAND, GetMenuItemID(GetMenu(HWindow), 0), 0);//如果 GetMenuItemID(GetMenu(HWindow), 0) 为不可用,while好像就直接跳出来了.
GetMenuString(GetMenu(HWindow), 0, buffer[1], MAX_PATH, MF_BYPOSITION);//这个是取这个菜单项的名字到buffer里.
end;

试一试。。。我没调试。。。
 
对不起,MAX_PATH 是什么意思?初值呢?
GetMenuString(GetMenu(HWindow), 0, buffer[1], MAX_PATH, MF_BYPOSITION);//出错,提示 [Error] Unit1.pas(56): Incompatible types: 'Char' and 'PAnsiChar'
lake_cx,可以帮忙帮到底,到网上下个dr.com帮我调试一下吗?这样应该你容易帮我解决些.这个软件只有 1.5M, 很小的.谢谢啦!
ps:IsWindowEnabled 可以检查菜单项的是否可用吗?我用了IsWindowEnabled(GetSubMenu(GetMenu(HWindow), 0)) 根本没有用.
 
GetMenuString(GetMenu(HWindow), 0, @buffer[1], MAX_PATH, MF_BYPOSITION);
 
我试过了,就用你原来的那种就可以。。。没什么问题
#0是字符串的结束符,等于号比较的话,发现#0它就认为字符串结束了,后面的不会再管了
你确定他的菜单显示的是“登录”?没有快捷键?没有空格?
 
谢谢你一直跟踪帮助.
确实没有什么快捷键,就是"登录"前多两个'','',我取@buffer[2]好了.
分先给你了.
如果方便的话,我可以加你qq吗?
还有个判断菜单是否可能的功能没搞定,用的 iswindowenabled ,判断不了.
 
后退
顶部