![](/img/trans.png)
[英]How can I create a window (HWND) without using CreateWindow(Ex)?
[英]Can the HWND from CreateWindow/CreateDialog be GetMessage'd from another thread?
使用 Win32 API,是否可以在一個線程中創建 Window 或 Dialog 然后從另一個線程收集事件?
HWND 是否與線程綁定?
嘗試下面的人為示例,我從未看到 GetMessage() 觸發。
HWND g_hWnd; DWORD WINAPI myThreadProc(LPVOID lpParam) { while(GetMessage(&msg, hWnd, 0, 0) > 0) { ... } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), 0, myDlgProc); CreateThread(NULL, 0 myThreadProc, NULL, 0, NULL); ... }
但在這里,我願意。
HWND g_hWnd; HINSTANCE g_hInstance; DWORD WINAPI myThreadProc(LPVOID lpParam) { hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), 0, myDlgProc); while(GetMessage(&msg, hWnd, 0, 0) > 0) { ... } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { g_hInstance = hInstance; CreateThread(NULL, 0 myThreadProc, NULL, 0, NULL); ... }
有人可以解釋我所看到的嗎?
不。
GetMessage 在當前線程的輸入隊列中返回消息。 HWND 參數是一個過濾器,因此 GetMessage 僅返回當前線程的輸入隊列中用於該 window 的消息。
Windows 具有線程關聯性 - 用於 window 的消息在創建並因此擁有 window 的線程上得到處理。
在您的第一個示例中,Dialog 和GetMessage位於不同的線程中。 文件說:
GetMessage function 從調用線程的消息隊列中檢索消息。
第二個示例有效,因為調用線程(對於GetMessage
)也擁有Dialog
。
在您的示例程序中創建 window 后完成。
但無論如何在win32中所有線程都有自己的消息隊列。
並且所有消息隊列都獲取在此線程中創建的 windows 的消息。
看:
http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx (使用消息和消息隊列)
http://msdn.microsoft.com/en-us/library/ms644936(VS.85).aspx (GetMessage函數)
您當然可以更改為任何 window 處理消息的 window 過程。 檢查 SetWindowLong function - http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx - 關於新 proc 的地址空間有一些規則。 我建議使用 dll。 另一種方法是子 class window 消息隊列。
當然可以 !
只需使用遠程代碼注入! (非常經典!)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.