Может ли HWND из CreateWindow / CreateDialog быть GetMessage'd из другого потока? - PullRequest
3 голосов
/ 06 марта 2009

Можно ли с помощью API-интерфейсов Win32 создать окно или диалог в одном потоке, а затем собирать для него события из другого потока?

Связаны ли 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);
    ...
}

Может кто-нибудь объяснить, что я вижу?

Ответы [ 7 ]

5 голосов
/ 06 марта 2009

номер

GetMessage возвращает сообщения во входной очереди текущего потока. Параметр HWND является фильтром, поэтому GetMessage возвращает только сообщения во входной очереди текущего потока, предназначенной для этого окна.

Windows имеет сродство к потоку - сообщения, предназначенные для окна, обрабатываются в потоке, который создал и, следовательно, владеет окном.

2 голосов
/ 07 марта 2009

Использовать AttachThreadInput .

2 голосов
/ 06 марта 2009

В вашем первом примере диалог и GetMessage находятся в отдельных потоках. И документация гласит:

Функция GetMessage извлекает сообщение из очереди сообщений вызывающего потока.

Второй пример работает, так как вызывающему потоку (для GetMessage) также принадлежит Dialog.

2 голосов
/ 06 марта 2009

Из MSDN :

Функция GetMessage извлекает сообщение от вызывающего потока очередь сообщений

Так что нет, то, что вы описываете, не представляется возможным напрямую.

0 голосов
/ 07 марта 2009

Конечно можно!

Просто используйте дистанционное внедрение кода! (очень классика!)

0 голосов
/ 06 марта 2009

Конечно, вы можете изменить процедуру окна, которая обрабатывает сообщения для любого окна. Проверьте функцию SetWindowLong - http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx - есть некоторые правила относительно того, какое адресное пространство представляет новый процесс. Я предлагаю использовать DLL. Другим способом является подкласс оконной очереди сообщений.

0 голосов
/ 06 марта 2009

В вашем примере программа заканчивается после создания окна.

Но в любом случае в win32 все потоки имеют собственную очередь сообщений.

И все очереди сообщений получают сообщения для окон, созданных в этой теме.

см

http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx (Использование сообщений и очередей сообщений)

http://msdn.microsoft.com/en-us/library/ms644936(VS.85).aspx (функция GetMessage)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...