如何给外部程序增加一个菜单Delphi源码.功能:增加的菜单能够有事件,如点击后能够知道是点的哪个菜单.这里有代码但没有事件产生:
AppendMenu(GetMenu(FindWindow(nil, 'MSN Messenger')),MF_STRING,3,'我的菜单');
这个菜单没有事件,如何再增加子菜单.

解决方案 »

  1.   

    如果窗口是你的,你完全可以在窗口里面作消息拦截,否则你要做钩子了,想办法用DLL嵌入到对方进程里面去,对方不可能到你的进程空间执行代码的。
      

  2.   

    怎么说才好呢,你给外部程序加一个菜单,外部程序的菜单事件你怎么能捕获呢!除非那个程序有接口,或是你用一个DLL挂钩到那个程序上,若有菜单点击消息则响应之,否则没有别的办法!
      

  3.   

    钩子我没做过,在自己的窗体里面拦截消息代码如下:
    实际上用VC的做一个框架,代码就是这样子的(不用MFC)procedure WndProc(var MyMessage: TMessage); override;procedure TfMain.WndProc(var MyMessage: TMessage);
    var
    pt: TPoint;
    begin
    case MyMessage.Msg of
      WM_CLOSE:  //关闭事件
      begin
        application.Minimize;
      end;
      WM_CREATE:
      begin
      WM_TASKBARCREATED := RegisterWindowMessage('TaskbarCreated');
      //创建托盘栏图标类
    TrayIcon := TTrayIcon.Create(self);
        TrayIcon.ActiveIcon.Handle := LoadIcon(HInstance, 'Tray0');
        TrayIcon.DeActiveIcon.Handle := LoadIcon(HInstance, 'Tray1');
      end;
      WM_DESTROY: // 窗体销毁消息
      begin
    //释放托盘栏图标
    TrayIcon.NotifyDelete(self.Handle);
       //释放托盘栏图标类
        TrayIcon.Free;
      end;
      WM_SYSCOMMAND:
       case MyMessage.WParam of
        SC_MINIMIZE:   // 窗体最小化
         application.Minimize
        else
    inherited;
        end;
      MYWM_NOTIFYICON:
    case MyMessage.lParam of
    WM_LBUTTONDBLCLK:  //鼠标左键双击
    begin
    if self.Showing = true then
          begin
    application.Minimize;
            self.Hide;
          end
    else
          begin
           self.Show;
           application.Restore;
    SetForegroundWindow(self.Handle);
          end;
    end;
    WM_RBUTTONDOWN:   //鼠标右键被按下
    begin
    GetCursorPos(pt);
    SetForegroundWindow(self.Handle);
        pmTrayIcon.Popup(pt.x,pt.y);
    end
    else
    //调用父类的WndProc方法处理其它消息
    inherited;
    end;
      else
      if MyMessage.Msg = WM_TASKBARCREATED then //托盘栏防崩溃处理
    begin
         TrayIcon.NotifyDelete(self.Handle);
         TrayIcon.NotifyAdd(self.Handle, self.Showing);
      end
        else
    //调用父类的WndProc方法处理其它消息
    inherited;
      end;
    end;
      

  4.   

    用HOOK截取你加菜单的那个程序的WM-COMMAND消息,如果WPARAM=你添加的菜单的ID号(这个ID号是你添加时自己指定的),添加处理代码。行不行未知。反正我没试。