关于网友提出的“ 高手请进:如何获得外部程序的菜单项内容?UP有分”问题疑问,本网通过在网上对“ 高手请进:如何获得外部程序的菜单项内容?UP有分”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 高手请进:如何获得外部程序的菜单项内容?UP有分
描述: 我在做一个项目,需要跟据外部程序所选择的菜单项动作,来在本程序内执行相应的响应.
我做了个全局的HOOK,可以截获菜单的点击的左右键事件,可以知道点击的是菜单,但是却始终区分不出点击了菜单哪一项.
后来想靠取得的内容来区分,但是别的对象比如BUTTON,LISTVIEW等都可以取到内容,只有菜单的取不到.
我想请问,为什么菜单的内容取不到?有没有什么办法可以取得到?或者说,可以区分出点击了哪一项菜单?
具体HOOK内容实现如下:
function Hookproc(iCode: Integer; wparam, lparam: LongInt): lresult; stdcall;
var PEvt: ^EVENTMSG;
FocusWnd: HWND;
aName: array [0..255] of char;
rPos: TPoint;
ahWnd:THandle;
begin
if iCode<0 then begin
result:= CallNextHookEx(haHook,iCode,wparam,lparam);
exit;
end;
if (iCode = HC_ACTION) then
begin
GetCursorPos(rPos);
ahWnd:=WindowFromPoint(rPos);
GetClassName(ahWnd,aName, 256);
if trim(aName)='#32768' then //是否是菜单?
form1.Label2.Caption :='选中的是菜单'
else
form1.Label2.Caption :=aName;
GetWindowText(ahWnd,aName,255); //获取该类名称.
form1.Label3.Caption :=aName;
FocusWnd:=GetActiveWindow;
if FocusWnd= IE_HWND then begin //IE_HWND为指定窗体句柄.
pEvt := Pointer(DWord(lParam)); //取鼠标结构.
if (pEvt.message = WM_LBUTTONDOWN) or (pEvt.message = WM_RBUTTONDOWN) then
begin
if pEvt.message = WM_LBUTTONDOWN then
form1.Label1.Caption :='左键按下'
else
form1.Label1.Caption := '右键按下';
end;
end;
end;
result:= CallNextHookEx(haHook,iCode,wparam,lparam);
end;
请教高手指点.谢谢!
解决方案1: 关注一下!
解决方案2: 截WM_MENUSELECT试试,按理来讲是可行的
解决方案3: up
解决方案4: 可以截取WM_INITMENU(菜单激活时),WM_MENUSELECT(菜单选择时),或者WM_SYSCOMMAND(wParam就是菜单的ID号)
解决方案5: up
解决方案6: 比较笨但是有效的方法
你可以给你的程序加上参数处理,在程序启动时判断
if ParamCount>1 then
begin
if ParamStr(1)='menu1' then
ShowMessage('菜单1')
esle if ParamStr(1)='menu2' then
ShowMessage('菜单2')
else
ShowMessage('直接运行的');
end;
/////////////////////////////////////////////////////////////////////////////
Delphi调用该程序:
ShellExcute(handle, 'open', '程序名','menu1',nil,SW_NORMAL)
VB调用:
ShellExecute Me.hwnd, "open", 程序名,"menu1", vbNullString, 1
解决方案7: 得到ID号再判断。
解决方案8: 菜单哪一项,可以将值放到自定义消息中,做消息发对来
以上介绍了“ 高手请进:如何获得外部程序的菜单项内容?UP有分”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/3593158.html