我已经取得开始按钮的句柄:
HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
WND hButtonBegin = GetWindow(hWnd, GW_CHILD);
证明是对的.
然后由该句柄调用getwindowlong()取得按钮的回凋函数
用setwindowlong()设置新的回调函数,在新的回调用函数中对click
消息进行控制,遇到wm_lbuttondown 就弹出一对话框要求输入密码.
但实现起来总是控制不了?
 为什么? 如何做?

解决方案 »

  1.   

    开始按钮的标题不是Shell_TrayWnd
      

  2.   

    需要 Hook 或 Inject DLL,SetWindowLong 在跨进程调用时无效。
      

  3.   

    跨进程调用是无效的,如果只要看密码,还是用getwindowtext, 它是个例外
      

  4.   

    不好意思太匆忙
    1.初始化的时候 OriginalClientProc = SetWindowLong(hCtl,GWL_WNDPROC,(long)MyProc);
    void MyProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
      switch(uMsg)
       {
         case WM_LBUTTONDOWN:
           //........... 
       }
      return CallWindowProc((FARPROC OriginalClientProc,hCtl,uMsg,uMsg.WParam,uMsg.LParam);
    }
    2.在窗体关闭时
    SetWindowLong(hCtl,GWL_WNDPROC,(long)OriginalClientProc);
    说明:
    hCtl是你的控件的句柄;
    MyProc是控件新的窗口过程函数,在里面进行你的操作;
    处理后,最后再调用它原来的窗口过程函数。
      

  5.   

    "Shell_TrayWnd"是得到状态栏的句柄