高手请进:如何在一个程序中控制另一个程序中的菜单事件 (100分)

R

redrain

Unregistered / Unconfirmed
GUEST, unregistred user!
我想实现在一个程序中按下某个按钮后,相当于在另外一个程序中按下了某个菜单项,<br>怎么才能实现,各位dfw帮忙了.程序如下:<br>unit Unit1;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,<br>&nbsp; Dialogs, StdCtrls;<br><br>type<br>&nbsp; TForm1 = class(TForm)<br>&nbsp; &nbsp; Button1: TButton;<br>&nbsp; &nbsp; Button2: TButton;<br>&nbsp; &nbsp; procedure Button1Click(Sender: TObject);<br>&nbsp; &nbsp; procedure Button2Click(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; { Private declarations }<br>&nbsp; &nbsp;FitemopenHandle, FitemcloseHandle : HWND;<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; Form1: TForm1;<br><br>implementation<br><br>function GetitemcloseHandle(hwnd: Integer; lparam: Longint):Boolean; stdcall;<br>var<br>&nbsp; buffer: array[0..255] of Char;<br>&nbsp; buffer1: array[0..255] of Char;<br>begin<br>&nbsp; Result := True;<br><br>&nbsp; GetClassName(hwnd,buffer,256);<br><br>if StrPas(Buffer)='MenuItem' then<br>&nbsp; begin<br>&nbsp; &nbsp; GetWindowText(hwnd,buffer1,100);<br>&nbsp; &nbsp; if buffer1 = '关闭' then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; PInteger(lparam)^ := hwnd; <br>&nbsp; &nbsp; &nbsp; Result:=False; &nbsp;<br>&nbsp; &nbsp; end;<br>&nbsp; end;}<br>end;<br>{$R *.dfm}<br><br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; Handle: Integer;<br>&nbsp; tmpHandle: Integer;<br>begin<br>&nbsp;Handle := FindWindow(nil,'----(3.30版)'); &nbsp; &nbsp;//就是窗口的Caption<br>&nbsp; if Handle&lt;&gt;0 then<br>&nbsp; begin<br>&nbsp; &nbsp; tmpHandle := Handle;<br>&nbsp; &nbsp; if getitemclosehandle(handle,0) then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp;EnumChildWindows(Handle,@GetitemcloseHandle,Integer(@Handle));<br>&nbsp; &nbsp; &nbsp;FitemcloseHandle := Handle;<br>&nbsp; &nbsp;end;<br>&nbsp; end;<br>end;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>begin<br>SendMessage(FitemcloseHandle,WM_LBUTTONDOWN,0,0);<br>SendMessage(FitemcloseHandle,WM_LBUTTONUP,0,0);<br>end;<br><br>end.<br><br>
 
高人都那里去了,快来帮帮忙哟
 
为什么没有人帮忙?救人一命,胜造七级浮屠!
 
同志,如两个程序都是您自己的,请在接收消息方定义自定义消息和处理过程。
 
to kkyy:<br><br>&nbsp;两个程序中只有一个是自己的
 
你这个方法漏洞多多。<br>首先EnumChildWindows不能遍历菜单在内的控件。<br>第二GetWindowText也得不到菜单项的caption。<br>菜单的classname也未必叫做'menuitem'.<br>我也曾想方设法控制菜单,但是还是水平不够。<br>即使你已经得到菜单项handle,向其发送WM_LBUTTONDOWN也没有效果,<br>反正菜单很奇怪就是了,不像别的vcl。<br>你还是另外想办法吧,比如说找到窗体handle,<br>向其发送键盘消息(顺序组合健)来达到你想要的效果。
 
不知道该菜单会不会改变标题<br>要不然,你可以用模拟按键实现呀
 
可以得到对方的菜单吧,如果是这样就可以运行了哦。如果有这样的需求,请<br>EMAIL:smj_9547@21cn.com,我以前一直都是开发这些东西的,原来我想开发一个<br>工具可以由用户选择如何处理的。但是没有时间,您这个我想我可以帮您的忙!
 
比方说,你在form1中按下了button1,相当于在form2中按下菜单项N3,你写好了button1的<br>onclick事件,<br>在form2的oncreate事件中写:N3.onclick:=form1.onbutton1.click;<br>不知道我对你的意思理解的对不对.
 
用DDE了,支持程序间相互控制!
 
你们想的太简单了<br><br>我是说另外一个程序不是我写的,是别人做好的已经编译好的程序,因为这个程序功能不完善,<br>需要我在写个程序,其中需要控制那个程序的菜单事件<br><br>
 
模拟鼠标可以吗?<br>我的qq:71892967
 
直接发WM_COMMAND消息
 
要么发送WM_COMMAND来控制别人的程序。也可以用钩子来捕捉WM_COMMAND消息,载处理!
 
同意晶晶同学,应该用钩子滴...[:D]
 
First, WinSight monitor the program to get Menuitem ID you want control,<br>then you can send WM_COMMAND message to it.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
933
SUNSTONE的Delphi笔记
S
I
回复
0
查看
505
import
I
I
回复
0
查看
555
import
I
I
回复
0
查看
526
import
I
顶部