2008-12-05 3 views
1

Я пишу какой-то код, который должен иметь возможность работать с любым окном, например окно, созданное через API окон, MFC, wxWidgets и т. Д.Получение контроля над основным потоком в приложении windows C++

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

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

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

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

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

WM_CALLBACK = WM_APP+1 

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

EDIT2: просто нашел RegisterWindowMessage :)

ответ

2

Если вы находитесь в том же процессе, как окно, которое вы можете зацепить его сообщения, подклассов его. Выезд 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

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

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

SetTimer(hWnd, event, 0, Function); 
Смежные вопросы