2013-03-14 5 views
0

Я зарегистрировал FINDMSGSTRINGW но он не показывает на главном цикле:Как сделать диалог FindText помещать его сообщения в основной цикл?

#include <windows.h> 
#include <iostream> 

int main() { 
    using namespace std; 
    UINT uFindReplaceMsg = RegisterWindowMessageW(FINDMSGSTRINGW); 
    WCHAR szFindWhat[MAX_PATH] = {0}; // buffer receiving string 

    FINDREPLACEW fr; 
    ZeroMemory(&fr, sizeof(fr)); 
    fr.lStructSize = sizeof(fr); 
    fr.hwndOwner = GetConsoleWindow(); 
    fr.lpstrFindWhat = szFindWhat; 
    fr.wFindWhatLen = MAX_PATH; 
    fr.Flags = 0; 
    HWND hdlg = FindTextW(&fr); 

    MSG msg; 
    for (;;) { 
    GetMessageW(&msg, 0, 0, 0); 
    TranslateMessage(&msg); 
    if (msg.message == uFindReplaceMsg) { 
     cout << "uFindReplaceMsg detected" << endl; 
    } 
    DispatchMessageW(&msg); 
    } 
} 

Нажав кнопку «найти следующий» в диалоговом окне должны выдавать сообщения в консоли, но ничего не происходит.

+0

Кажется, что консольное приложение, где вы настроили очередь сообщений? –

ответ

2

Как говорится в первом предложении the documentation:

находке или Replace диалоговое окно посылает FINDMSGSTRING зарегистрировано сообщение оконной процедуре его окна владельца, когда пользователь нажимает Найти Далее Заменить , или Заменить все, или закрывает диалоговое окно.

(Emphasis mine.) Отправленные сообщения доставляются непосредственно в процедуру окна и не извлекаются GetMessage. В общем, вы не должны использовать дескриптор GetConsoleWindow для размещения пользовательского интерфейса, потому что у вас нет доступа к его процедуре сообщений, и поэтому такие вещи не будут работать.

0

Я искал не то место. Сообщение появляется в процедуре окна родительского окна диалога, вот рабочий код:

#include <windows.h> 
#include <iostream> 

UINT uFindReplaceMsg = RegisterWindowMessageW(FINDMSGSTRINGW); 

LRESULT CALLBACK MyWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    if (Msg == uFindReplaceMsg) std::cout << "uFindReplaceMsg catched" << std::endl; 
    return DefWindowProcW(hWnd, Msg, wParam, lParam); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow) { 
    using namespace std; 

    WNDCLASSEXW wc; 
    wc.cbSize = sizeof(WNDCLASSEXW); 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = &MyWndProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = sizeof(PVOID); 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hIconSm = NULL; 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BACKGROUND); 
    wc.lpszMenuName = L"MainMenu"; 
    wc.lpszClassName = L"window"; 
    ATOM class_atom = RegisterClassExW(&wc); 

    HWND hWnd = CreateWindowExW(
    0, 
    reinterpret_cast<LPCWSTR>(class_atom), 
    L"window title", 
    WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPCHILDREN | WS_THICKFRAME, 
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 
    NULL, 
    NULL, 
    hInstance, 
    NULL 
); 

    WCHAR szFindWhat[MAX_PATH] = {0}; 

    FINDREPLACEW fr; 
    ZeroMemory(&fr, sizeof(fr)); 
    fr.lStructSize = sizeof(fr); 
    fr.hwndOwner = hWnd; 
    fr.lpstrFindWhat = szFindWhat; 
    fr.wFindWhatLen = MAX_PATH; 
    fr.Flags = 0; 
    HWND hdlg = FindTextW(&fr); 

    MSG msg; 
    for (;;) { 
    GetMessageW(&msg, 0, 0, 0); 
    TranslateMessage(&msg); 
    DispatchMessageW(&msg); 
    } 
}