我正在一個Win32 C++應用程序,我想忽略鼠標事件,讓我通過窗口下方的窗口。基本上我的下面的窗口將處理鼠標事件。我不希望使用SendMessage將鼠標消息發送到我的下方的窗口或使用SetCapture。有沒有辦法基本上忽略鼠標事件,讓它通過Windows API或樣式?請注意,我的窗口不透明。讓鼠標通過Windows C++
在此先感謝您的幫助。
我正在一個Win32 C++應用程序,我想忽略鼠標事件,讓我通過窗口下方的窗口。基本上我的下面的窗口將處理鼠標事件。我不希望使用SendMessage將鼠標消息發送到我的下方的窗口或使用SetCapture。有沒有辦法基本上忽略鼠標事件,讓它通過Windows API或樣式?請注意,我的窗口不透明。讓鼠標通過Windows C++
在此先感謝您的幫助。
我會嘗試處理WM_NCHITTEST並返回HTNOWHERE
。
我相信使用WS_EX_TRANSPARENT的方法會產生其他副作用,並且只在基礎窗口屬於同一個線程時纔有用。從這個問題來看,底層窗口是否屬於同一個應用程序或下面的任何舊應用程序並不清楚。
感謝您的迴應。我正在開發遠程桌面連接(RDC)環境的應用程序,您可以遠程訪問另一臺Window 7計算機。我有一個窗口,它是RDC的子窗口 - 合成窗口--RDC窗口完全是我無法控制的另一個過程。所以當鼠標移過來,點擊,雙擊我的窗口,我只想忽略它並將它傳遞給它下面的窗口。它下面的窗口是RDC窗口,它將把它傳送到遠程會話中的右側窗口。我嘗試了WM_NCHITTEST和WS_EX_TRANSPARENT,但都沒有成功。 – JoderCoder
我一直在測試2個不同的RDC解決方案由2個不同的第三方。每個解決方案可能是不同的創建自己的窗口,以不同的風格等。如果我的WindowProc做如下:
case WM_MOUSEMOVE:
{
std::cout << "WM_MOUSEMOVE" << std::endl;
VideoWindowWin32* window = reinterpret_cast<VideoWindowWin32*> (GetWindowLongPtr (hWnd, GWL_USERDATA));
if (window)
{
HWND rParent = GetParent(window->window);
SetCapture(window->parent);
//SendMessage(window->parent, uMsg, wParam, lParam);
}
}
break;
一切工作與他們的一個。但它不適用於其他。
如果您有任何建議,我將不勝感激。
嘗試使用MS Spy找出Windows層次結構,樣式和消息流。 – Stan
基於阿德里安·麥卡錫,但實際上對我的作品(雖然只有當父母擁有的子窗口,否則窗口將趕上再次鼠標):
case WM_NCHITTEST: return HTTRANSPARENT;
HTNOWHERE
只是造成了使用LoadCursor()窗戶不再顯示。
這些值似乎是可能的:
#ifndef NONCMESSAGES
/*
* WM_NCHITTEST and MOUSEHOOKSTRUCT Mouse Position Codes
*/
#define HTERROR (-2)
#define HTTRANSPARENT (-1)
#define HTNOWHERE 0
#define HTCLIENT 1
#define HTCAPTION 2
#define HTSYSMENU 3
#define HTGROWBOX 4
#define HTSIZE HTGROWBOX
#define HTMENU 5
#define HTHSCROLL 6
#define HTVSCROLL 7
#define HTMINBUTTON 8
#define HTMAXBUTTON 9
#define HTLEFT 10
#define HTRIGHT 11
#define HTTOP 12
#define HTTOPLEFT 13
#define HTTOPRIGHT 14
#define HTBOTTOM 15
#define HTBOTTOMLEFT 16
#define HTBOTTOMRIGHT 17
#define HTBORDER 18
#define HTREDUCE HTMINBUTTON
#define HTZOOM HTMAXBUTTON
#define HTSIZEFIRST HTLEFT
#define HTSIZELAST HTBOTTOMRIGHT
#if(WINVER >= 0x0400)
#define HTOBJECT 19
#define HTCLOSE 20
#define HTHELP 21
#endif /* WINVER >= 0x0400 */
/*
* SendMessageTimeout values
*/
#define SMTO_NORMAL 0x0000
#define SMTO_BLOCK 0x0001
#define SMTO_ABORTIFHUNG 0x0002
#if(WINVER >= 0x0500)
#define SMTO_NOTIMEOUTIFNOTHUNG 0x0008
#endif /* WINVER >= 0x0500 */
#if(WINVER >= 0x0600)
#define SMTO_ERRORONEXIT 0x0020
#endif /* WINVER >= 0x0600 */
#if(WINVER >= 0x0602)
#endif /* WINVER >= 0x0602 */
#endif /* !NONCMESSAGES */
看[先回答這裏(http://stackoverflow.com/questions/6165136/ws-ex-transparent-what-does-it-actually -做)。它建議使用WS_EX_TRANSPARENT(一個窗口不透明,但鼠標事件不會通過)。如果你買不起這個,那麼其他可能的解決方案就更加複雜了,包括從上層窗口到下層窗口的窗口子類化和手動轉發鼠標事件。 – Stan
感謝您的回覆。我嘗試了WS_EX_TRANSPARENT,但由於某種原因它沒有工作,它沒有將鼠標事件傳遞到下面的窗口。 – JoderCoder