Получение контроля над основным потоком в приложении Windows C ++ - PullRequest
1 голос
/ 05 декабря 2008

Я пишу некоторый код, который хотел бы работать с любым окном, например с окном, созданным через Windows API, MFC, wxWidgets и т. Д.

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

Моей первой мыслью было отправить сообщение обратного вызова в окно, которое затем вызвало бы функцию в моем коде, когда оно получит сообщение, используя один из параметров и указатель на функцию некоторого вида. Однако для этого не существует стандартного сообщения Windows, и я не могу создать собственное сообщение, так как не управляю кодом Windows, поэтому не могу добавить необходимый код в обработчик сообщений для реализации обратного вызова ...

Есть ли другой способ получить поток, который создал окно для входа в мою функцию?

EDIT: Джон Z предположил, что я зацепил сообщения Windows. Если я это сделаю, есть ли какой-нибудь способ получить «идентификаторы» для пользовательских сообщений без риска конфликта с любыми пользовательскими сообщениями, которые уже есть в окне?

Например, я мог бы сделать

WM_CALLBACK = WM_APP+1

Но если подключаемое окно уже что-то сделало с WM_APP + 1, я столкнусь с проблемами.

EDIT2: только что найден RegisterWindowMessage:)

Ответы [ 2 ]

2 голосов
/ 05 декабря 2008

Если вы находитесь в том же процессе, что и окно, вы можете перехватить его сообщения, поместив его в подкласс. Проверить http://msdn.microsoft.com/en-us/library/ms633570(VS.85).aspx

Ключевым API является SetWindowLong.

// Subclass the edit control. 
wpOrigEditProc = (WNDPROC) SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG)EditSubclassProc); 

// Remove the subclass from the edit control. 
SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG)wpOrigEditProc); 
0 голосов
/ 05 декабря 2008

Кроме подклассов, вы можете использовать SetTimer для вызова функции в потоке окна.

VOID CALLBACK Function(      
HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
)
{
  // stuff
}

SetTimer(hWnd, event, 0, Function);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...