2012-07-31 66 views
5

我現在擁有的東西:我在C#中的應用程序是半透明的,並且不捕獲winapi事件 - 每次點擊,拖動等都是通過下層窗口捕獲的,這是獨立的應用程序(如webbrower)。我用它來覆蓋瀏覽器顯示的信息。這是我對這段代碼:將winapi事件轉移到另一個窗口

int exstyle = GetWindowLong(this.Handle, GWL_EXSTYLE); 
exstyle |= WS_EX_TRANSPARENT; 
SetWindowLong(this.Handle, GWL_EXSTYLE, exstyle); 

IntPtr hwndf = this.Handle; 
IntPtr hwndParent = GetDesktopWindow(); 
SetParent(hwndf, hwndParent); 

但現在,我想所有的事件發送到我的兩個應用程序窗口(這是對上半透明)和Web瀏覽器(在我的應用程序)。因此,例如,如果我點擊,點擊在兩個窗口中都起作用,就好像它們在頂部一樣。我想只有這樣做的方法是捕捉所有事件,然後將它們轉發到較低窗口,但是有什麼辦法可以做到嗎? 我使用winforms作爲窗口庫。


我現在所做的並不是那麼重要,因爲我想通常消耗事件,然後將它們轉發到下層窗口。所以這與我現在使用WS_EX_TRANSPARENT所做的完全不同。這一點就是同時在兩個窗口中拖動內容。如果還有更好的方法,我會很高興聽到它。


由於至少我需要的是要拖動事件傳遞給兩個窗口,和所有其他事件墊層窗口(不是我的控制之下)。所以,也許跟WS_EX_TRANSPARENT(讓事件傳遞給底層窗口)一起留在我的窗口並且簡單地安裝全局鉤子來接收拖動事件會更容易?你怎麼看?

順便說一句我沒有Winapi的經驗,所以解決方案可能很明顯。

+0

我不不要理解你沒有得到什麼事情......你在創建一個實際的窗口(你應該)?或者直接畫到屏幕上(你不應該!)? – tenfour 2012-07-31 23:15:48

+0

@tenfour通過設置'WS_EX_TRANSPARENT'樣式。 – Neil 2012-07-31 23:25:46

+0

@tenfour是的,我使用.net winform創建的窗口,並且繪圖由winform處理,所以它創建窗口。我只設置了WS_EX_TRANSPARENT風格,並將窗口父窗口設置爲桌面,這使得事件傳遞到下層窗口,如下所示: http://www.codeproject.com/Articles/12877/Transparent-Click-Through-Forms 是的,它確實使消息不能進入窗口,只要窗口是桌面的子節點即可。 – Deadeye 2012-08-01 08:02:32

回答

0

您可以捕獲Windows事件發出自己的表單由窗體上超載的WndProc,或者致電user32!GetMessage

您可以通過user32!PostMessageuser32!SendMessage的API(read PostMessage function on msdn)發送消息給其他Windows窗體。

0

您可以嘗試在基礎表單處理它之後轉發事件。像

protected override void OnDragOver(DragEventArgs drgevent) 
{ 
    base.OnDragOver(drgevent); 
    MyControl.ForwardDragEvent(drgevent); 
} 

在MyControl東西:

public void ForwardDragEvent(DragEventArgs drgevent) 
{ 
    base.OnDragOver(drgevent); 
    //Or call your own method to handle the event 
} 

我已經使用這個來向前滾動的事件,在我的情況然而,只有其中一個控件處理該事件..

相關問題