2012-10-25 35 views
3

我正在一個Win32 C++應用程序,我想忽略鼠標事件,讓我通過窗口下方的窗口。基本上我的下面的窗口將處理鼠標事件。我不希望使用SendMessage將鼠標消息發送到我的下方的窗口或使用SetCapture。有沒有辦法基本上忽略鼠標事件,讓它通過Windows API或樣式?請注意,我的窗口不透明。讓鼠標通過Windows C++

在此先感謝您的幫助。

+2

看[先回答這裏(http://stackoverflow.com/questions/6165136/ws-ex-transparent-what-does-it-actually -做)。它建議使用WS_EX_TRANSPARENT(一個窗口不透明,但鼠標事件不會通過)。如果你買不起這個,那麼其他可能的解決方案就更加複雜了,包括從上層窗口到下層窗口的窗口子類化和手動轉發鼠標事件。 – Stan

+0

感謝您的回覆。我嘗試了WS_EX_TRANSPARENT,但由於某種原因它沒有工作,它沒有將鼠標事件傳遞到下面的窗口。 – JoderCoder

回答

1

我會嘗試處理WM_NCHITTEST並返回HTNOWHERE

我相信使用WS_EX_TRANSPARENT的方法會產生其他副作用,並且只在基礎窗口屬於同一個線程時纔有用。從這個問題來看,底層窗口是否屬於同一個應用程序或下面的任何舊應用程序並不清楚。

+0

感謝您的迴應。我正在開發遠程桌面連接(RDC)環境的應用程序,您可以遠程訪問另一臺Window 7計算機。我有一個窗口,它是RDC的子窗口 - 合成窗口--RDC窗口完全是我無法控制的另一個過程。所以當鼠標移過來,點擊,雙擊我的窗口,我只想忽略它並將它傳遞給它下面的窗口。它下面的窗口是RDC窗口,它將把它傳送到遠程會話中的右側窗口。我嘗試了WM_NCHITTEST和WS_EX_TRANSPARENT,但都沒有成功。 – JoderCoder

1

我一直在測試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; 

一切工作與他們的一個。但它不適用於其他。

如果您有任何建議,我將不勝感激。

+1

嘗試使用MS Spy找出Windows層次結構,樣式和消息流。 – Stan

0

基於阿德里安·麥卡錫,但實際上對我的作品(雖然只有當父母擁有的子窗口,否則窗口將趕上再次鼠標):

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 */