您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> Delphi >> 高手请进:如何获得外部程序的菜单项内容?UP有分

高手请进:如何获得外部程序的菜单项内容?UP有分

来源:网络整理     时间:2016/8/25 23:20:08     关键词:

关于网友提出的“ 高手请进:如何获得外部程序的菜单项内容?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

相关图片

相关文章