簡體   English   中英

來自 CreateWindow/CreateDialog 的 HWND 可以從另一個線程獲取消息嗎?

[英]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 的線程上得到處理。

MSDN

GetMessage function 從調用線程的消息隊列中檢索消息

所以不,你描述的不是直接可能的。

在您的第一個示例中,Dialog 和GetMessage位於不同的線程中。 文件說:

GetMessage function 從調用線程的消息隊列中檢索消息。

第二個示例有效,因為調用線程(對於GetMessage )也擁有Dialog

使用AttachThreadInput

在您的示例程序中創建 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.

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