要求:1、用全局勾子(dll)
      2、当鼠标点击任意窗口上的控件时,得到该控件的句柄
      3、将句柄传回主程序完成后另开贴给分。

解决方案 »

  1.   

    1、hook鼠标的lbuttondown消息
    2、HWND hWnd = WindowFromPoint(point);
    3、把hWnd返回给主程序
      

  2.   

    LRESULT CALLBACK MousePorc(int nCode,WPARAM wParam,LPARAM lParam)
    {
        if(nCode == HC_ACTION)
        {
             MOUSEHOOKSTURCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
             g_hWnd = WindowFromPoint(pMHS->pt);//g_hWnd 全局变量
             SendMessage(hWnd,WM_MYMESSAGE,0,(LPARAM)lParam;你的程序的窗口句柄
         }
    }
      

  3.   

    CHKK(hello) 能把这个程序也让我看看吗?谢谢了,我可以另开帖子给你分。
    [email protected][email protected]都行
      

  4.   

    请留邮箱,我给你发送源码。
    源码功能:
        使用鼠标获取所有Windows 32位操作系统下鼠标下的密码。
        通过鼠标移动可以改变另外一个程序界面的特征。
    比如把一个灰色的按钮,设置成允许状态。把隐藏的按钮显示出来。
    把灰色的菜单设置成允许,把隐藏的菜单显示出来。注意这是两个进程的操作。
    有了源代码,你还可以扩充。
      

  5.   

    邮件已经发出请查收!这是以前做的一个练习程序写的有点乱,但完成楼主说的功能绰绰有余,DLL里面还有一些高级功能,要用时请注意,这是以前的写的,我不保证别的功能不出问题!朋友们需要的话我会把它完成后在发出来
      

  6.   

    To: flyelf(空谷清音)
    按你的方法,单击窗口也会得到窗口的句柄,而我要得到窗口上控件的句柄。To: wangjs720(听雨舟)
    你的方法只要鼠标移动就会得到句柄
      

  7.   

    /************************************************************
    write by: C.H.K.K 2003.06.24
    ************************************************************/
    //函数:处理鼠标钩子消息的函数
    LRESULT CALLBACK MouseProc(
      int nCode,      // hook code
      WPARAM wParam,  // message identifier
      LPARAM lParam   // mouse coordinates
    )
    {
    //鼠标消息钩子结构
    MOUSEHOOKSTRUCT * stpMouseHook;//POINT stPoint;
    HWND  hHwnd;
    char szTemp[512];
    char szPrint[1024]; if(nCode<0)
    {//当nCode小于0时必须返回CALLNEXTHOOKEX()
    return CallNextHookEx(hhkMouse,nCode,wParam,lParam);
    }
    if(nCode==HC_ACTION)
    {//处理鼠标消息钩子
     //WM_LBUTTONDOWN,WM_LBUTTONUP,WM_MOUSEMOVE
     //WM_MOUSEWHEEL,WM_RBUTTONDOWN, or WM_RBUTTONUP.  if(wParam==WM_RBUTTONUP )
    {
    stpMouseHook=(MOUSEHOOKSTRUCT *) lParam;
    wsprintf(szTemp,"\nWindow's hwnd: %d \n Title:",stpMouseHook->hwnd);
    strcpy(szPrint,szTemp);
    //得到鼠标消息的窗口标题
    GetWindowText(stpMouseHook->hwnd,szTemp,512);
    strcat(szPrint,szTemp);
    //得到鼠标消息的窗口类名
    strcpy(szTemp,"\n Class Name:");
    strcat(szPrint,szTemp);
    GetClassName(stpMouseHook->hwnd,szTemp,512);
    strcat(szPrint,szTemp);
    //得到父窗口
    hHwnd=GetParent(stpMouseHook->hwnd);
    if( hHwnd )
    {
    wsprintf(szTemp,"\n Parent window hwnd:%d ",hHwnd);
    strcat(szPrint,szTemp);
    GetWindowText(hHwnd,szTemp,512);
    strcat(szPrint,szTemp);
    wsprintf(szTemp,"\n Parent window class name:");
    strcat(szPrint,szTemp);
    GetClassName(hHwnd,szTemp,512);
    }
    else
    {
    strcpy(szTemp,"\n No Parent window");
    }
    strcat(szPrint,szTemp); hHwnd=GetActiveWindow();
    wsprintf(szTemp,"\n Active Window Hwnd:%d",hHwnd);
    strcat(szPrint,szTemp);
    //得到鼠标所在的桌面坐标
    wsprintf(szTemp,"\n Position: x- %d",stpMouseHook->pt.x);
    strcat(szPrint,szTemp);
    wsprintf(szTemp,"\n           y- %d",stpMouseHook->pt.y);
    strcat(szPrint ,szTemp);
    if(! FindWindow(NULL,"WH_MOUSE") )
    MessageBox(NULL,szPrint,"WH_MOUSE",MB_SYSTEMMODAL);
    //写入文件MOUSELOG.LOG
    SaveLog("c:\\chkkMS.LOG",szPrint); }
    }
    return  CallNextHookEx(hhkMouse,nCode,wParam,lParam);
    //return 0;
    }
    //导出函数:设置鼠标钩子
    EXPORT BOOL   SetMouseHook()
    {//挂上鼠标钩子
    if(!(hhkMouse=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseProc,hIns,0)))
      { MessageBox(NULL,"can not set mouse hook","",0);
    return FALSE;
      }

    MessageBox(NULL,"set WH_MOUSE hook","message:",0);
      
    return TRUE;
    }
    //导出函数:卸载鼠标钩子
    EXPORT BOOL   UnSetMouseHook() 
    {//取消鼠标钩子
    MessageBox(NULL,"unset WH_MOUSE  hook","",0);
    return UnhookWindowsHookEx(hhkMouse);
    }
      

  8.   

    钩子问题这么多人都说了,我想没什么问题了。如传回来我想也不难:主程序首先向Windows注册一条消息。如名称为:"MyMessage10023".调用启动DLL钩子的函数中,将该串及一个主程序窗口的句柄传过去。当钩子回调中得到了控件的句柄后就向这个窗口发送该消息 :并将控件的句柄作为参数传回来。主程序窗口应该重载WimdowProc虚函数来捕获该消息。其它地方捕获不到,我不知道为什么。
    注意,在DLL中也应注册该消息。
      

  9.   

    我现在也在做类似你做的事情
    我顺便问楼主一个问题,我现在已经找到控件的句柄了。如何去操作和控制它了???
    这个我想了很久,而且这个控件不是window中的标准控件,是一个自定义控件,不是自己写的,他没有消息,而且是个com。
      

  10.   

    下面的代码是根据鼠标的点得到最上的子窗口句柄
    HWND SmallestWindowFromPoint( const POINT point )
    {
    RECT rect, rcTemp;
    HWND hParent, hWnd, hTemp; hWnd = ::WindowFromPoint( point );
    if( hWnd != NULL )
    {
    ::GetWindowRect( hWnd, &rect );
    hParent = ::GetParent( hWnd ); // Has window a parent?
    if( hParent != NULL )
    {
    // Search down the Z-Order
    hTemp = hWnd;
    do{
    hTemp = ::GetWindow( hTemp, GW_HWNDNEXT ); // Search window contains the point, hase the same parent, and is visible?
    ::GetWindowRect( hTemp, &rcTemp );
    if(::PtInRect(&rcTemp, point) && ::GetParent(hTemp) == hParent && ::IsWindowVisible(hTemp))
    {
    // Is it smaller?
    if(((rcTemp.right - rcTemp.left) * (rcTemp.bottom - rcTemp.top)) < ((rect.right - rect.left) * (rect.bottom - rect.top)))
    {
    // Found new smaller window!
    hWnd = hTemp;
    ::GetWindowRect(hWnd, &rect);
    }
    }
    }while( hTemp != NULL );
    }
    } return hWnd;
    }
      

  11.   

    http://220.195.149.80:8080/view.asp?file=100讲的很好了
      

  12.   

    [email protected]
    发一个源程序学习学习!
      

  13.   

    思路基本有了
    只差一点,在dll中,如何把HOOK hook;设置为全局数据段?
      

  14.   

    思路基本有了
    只差一点,在dll中,如何把HOOK hook;设置为全局数据段?
      

  15.   

    我发了代码了,用那个共享段,
    就是在编译起里面加入;section:"sharedata" rws
    sharedata 是在员代码里面定义的。
      

  16.   

    用钩子倒是罗嗦了
    codeproject里面有一个模仿spy++的例子,很好。具体位置没记住,自己看看。
      

  17.   

    LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam) 
    {
    if(nCode == HC_ACTION)
        {
    if(wParam == WM_LBUTTONDOWN)
    {
    MOUSEHOOKSTRUCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
    g_hWnd = WindowFromPoint(pMHS->pt);
    char szName[128];
    GetClassName(g_hWnd,szName,128);
    if(strcmp(szName,"Edit")==0)
    {
    MessageBox(NULL,szName, "szName",MB_ICONSTOP);
    SendMessage(m_hWnd,WM_MYMESSAGE,0,(UINT)g_hWnd);
    return 1;
    }
    }
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
    }这个函数有问题, 点一个EDIT总是弹出好多个窗口来,为什么?
      

  18.   

    LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam) 
    {
        if(nCode == HC_ACTION)
        {
    if(wParam == WM_LBUTTONDOWN)
    {
    MOUSEHOOKSTRUCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
    g_hWnd = WindowFromPoint(pMHS->pt);
    char szName[128];
    GetClassName(g_hWnd,szName,128);
    if(strcmp(szName,"Edit")==0)
    {
    MessageBox(NULL,szName, "szName",MB_ICONSTOP);
    SendMessage(m_hWnd,WM_MYMESSAGE,0,(UINT)g_hWnd);
    return 1;
    }
    }
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
    }这个函数有问题, 点一个EDIT总是弹出好多个窗口来,为什么?
      

  19.   

    LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam) 
    {
    if(nCode == HC_ACTION)
        {
    if(wParam == WM_LBUTTONDOWN)
    {
    MOUSEHOOKSTRUCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
    g_hWnd = WindowFromPoint(pMHS->pt);
    char szName[128];
    GetClassName(g_hWnd,szName,128);
    if(strcmp(szName,"Edit")==0)
    {
    MessageBox(NULL,szName, "szName",MB_ICONSTOP);
    SendMessage(m_hWnd,WM_MYMESSAGE,0,(UINT)g_hWnd);
    return 1;
    }
    }
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
    }这个函数有问题, 点一个EDIT总是弹出好多个窗口来,为什么?
      

  20.   

    LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam) 
    {
    if(nCode == HC_ACTION)
        {
    if(wParam == WM_LBUTTONDOWN)
    {
    MOUSEHOOKSTRUCT *pMHS = (MOUSEHOOKSTRUCT *)lParam;
    g_hWnd = WindowFromPoint(pMHS->pt);
    char szName[128];
    GetClassName(g_hWnd,szName,128);
    if(strcmp(szName,"Edit")==0)
    {
    MessageBox(NULL,szName, "szName",MB_ICONSTOP);
    SendMessage(m_hWnd,WM_MYMESSAGE,0,(UINT)g_hWnd); }
    }
    }
    return CallNextHookEx(hHook,nCode,wParam,lParam);
    }dll中的勾子的回调函数源码.
      

  21.   

    其实,何必用钩子呢?你直接使用SetCapture,然后在你的程序中,响应WM_LBUTTONDOWN消息,然后再调用WindowFromPoint函数,就可以得到对应窗口的句柄了。如果使用钩子,显得多此一举!