簡體   English   中英

將winapi事件轉發到另一個窗口

[英]forward winapi events to another window

我現在擁有的:我在C#中的應用程序是半透明的,並沒有捕獲winapi事件 - 每次點擊,拖動等都是通過底層窗口捕獲的,這是一個單獨的應用程序(如webbrower)。 我使用它來覆蓋瀏覽器顯示的信息。 這是我的代碼:

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作為窗口lib。


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


至少我需要的是將拖動事件傳輸到兩個窗口,並將所有其他事件傳輸到底層窗口(不受我的控制)。 那么,也許更容易將我的窗口保持為WS_EX_TRANSPARENT(使事件直通到底層窗口)並簡單地安裝全局鈎子來接收拖動事件? 你怎么看?

順便說一句,我沒有使用Winapi的經驗,因此解決方案可能很明顯。

您可以通過在表單上重載WndProc來捕獲發送自己的表單的Windows事件,或者通過調用user32!GetMessage

您可以通過user32!PostMessage發送消息到其他Windows窗體user32!PostMessageuser32!SendMessage apis( 在msdn上讀取PostMessage函數 )。

您可以嘗試在基礎表單處理之后轉發事件。 就像是

 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
}

我使用它來轉發滾動事件,但在我的情況下,只有一個控件處理事件..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM