2013-08-16 73 views
4

在我的媒體播放器應用程序中,我使用SetCursor(NULL)隱藏光標,並確保Windows不重置遊標狀態,我在我的WndProc方法中處理了WM_SETCURSOR如何在C#中處理WM_SETCURSOR

protected override void WndProc(ref Message m) 
{ 
    switch (m.Msg) 
    { 
     case WM.SETCURSOR: 
      base.WndProc(ref m); 
      int lowWord = (m.LParam.ToInt32() << 16) >> 16; 
      if (lowWord == HTCLIENT && FullScreen) 
      { 
       SetCursor(IntPtr.Zero); // hides cursor 
       m.Result = (IntPtr)1; // return TRUE; equivalent in C++ 
      } 
      return; 
    } 
} 

然而,當光標在客戶區(又名LOWORD(lParam) == HTCLIENT),WM_SETCURSOR從未在WndProc觸發。所以當光標在客戶區域時,我實際上從來沒有得到WM_SETCURSOR消息,只有在LOWORD(lParam) != HTCLIENT時纔會得到消息。

但是在Spy ++中,它清楚地表明應用程序收到了WM_SETCURSORWM_MOUSEMOVE消息。

消息丟失/處理的地方在哪裏?我需要做什麼才能在C#中收到WM_SETCURSOR消息?

+2

我不知道我頭頂的答案。但爲什麼你不能只設置窗體的光標? –

+0

我不知道爲什麼它不能爲你工作。我測試了一個簡單的代碼,它的功能就像一個魅力。 –

+0

你確定'HTCLIENT = 1'嗎? –

回答

0

我的應用程序有幾個面板覆蓋應用程序。所以另一位用戶友好地向我指出,由於每個控件都有自己的WndProc,所以方法不會被傳遞到它下面的表單。爲了接收這些消息,我必須用它自己的WndProc方法覆蓋每個面板。

但是,如果沒有控件覆蓋光標所在的表單,上面的代碼可以工作。