[英]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!PostMessage
或user32!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.