我在写一个钩子程序,发现不同语言编译出来的单击button时的消息参数好象是不一样的//此过程是在一个dll中窗口钩子
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{
  CWPSTRUCT *p = (CWPSTRUCT *)lParam;
  // 捕获单击按钮的消息,这里如是挂在VB,VC写的程序时,wParam=1可捕获单击按钮的消息
  //如是挂在.NET,Dephi写的程序时,wParam=1捕获不了单击按钮的消息,这里应怎么写才能捕获
  //不同语言编译的单击button消息?
 if (p->message == WM_COMMAND && LOWORD(p->wParam)==?)
 {
     //执行代码
     ............
 }
}

解决方案 »

  1.   

    用spy++看id,或直接用句柄来判断
      

  2.   

    问一下这个p->wParam中放的是按钮的id吗?p->lParam中是什么?
    还有为什么OutputDebugString("")在dll中不输出内容呢?
      

  3.   

    CWPSTRUCT结构的wparam和lparam参数与具体的消息有关。
    对于WM_COMMAND
    wParam 
    The high-order word specifies the notification code if the message is from a control. If the message is from an accelerator, this value is 1. If the message is from a menu, this value is zero. 
    The low-order word specifies the identifier of the menu item, control, or accelerator. lParam 
    Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL
      

  4.   

    表现形式可能不一样,但是归根结底都是调用Windows的API!!应该说本质都是一样的!
      

  5.   

    我用SPY++看了,VC,VC的控件ID是不变的,也就是程序设计时是多少就是多少,而.net和Dephi的控件ID则是该控件的句柄
    那么我在找一个.net程序的某个控件的消息时,是不是应该这样写?
    LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
      CWPSTRUCT *p = (CWPSTRUCT *)lParam;
      if (p->message == WM_COMMAND && 
           LOWORD(p->wParam)==(UINT_PTR)FindWindowEx   (g_hwnd,NULL, "WindowsForms10.BUTTON.app3","发送"))
     {
         ..............
      }
    可是这样依然不行啊.....
      

  6.   

    FindWindowEx   (g_hwnd,NULL, "WindowsForms10.BUTTON.app3","发送")
    得到一个窗口句柄,用spy++再找到控件句柄,看是否一样
      

  7.   

    我怀疑是这数据类型转换是不是有问题:
     LOWORD(p->wParam)==(UINT_PTR)FindWindowEx   (g_hwnd,NULL, "WindowsForms10.BUTTON.app3","发送"))
    正确的应该是怎么转?
      

  8.   

    FindWindowEx返回hwnd,转不转应该都一样,关键照我上面的方法看一下两者指针是否一致
      

  9.   

    我看了FindWindowEx   (g_hwnd,NULL, "WindowsForms10.BUTTON.app3","发送")得到的窗口句柄与spy++听控件句柄是一样的
      FindWindowEx返回hwnd,p->wParam返回UINT_PTR,如果不转,编译通不过,我试了
      

  10.   

    p->wParam返回The low-order word specifies the identifier of the menu item, control, or accelerator
    你只要这么写就行了:
    if (p->message == WM_COMMAND && 
           LOWORD(p->wParam)==(WORD)FindWindowEx   (g_hwnd,NULL, "WindowsForms10.BUTTON.app3","发送"))
      

  11.   

    kingzai() :太感谢您了,此问题解决了.
     现还有个问题想向您请教一下:如果一个窗体上有多个TextBox,如txt1,txt2,tx3...
    我怎样才能找到我想要的某个TextBox的句柄(如txt2),用GetWindws?(这个好象只能找到第一个?)
      

  12.   

    EnumChildWindows枚举窗口,根据ctrlid判断