2013-03-14 1 views
0

Я действительно не понимаю эти примеры из Интернета. Все они фрагментарны. Нигде нет простого краткого примера, как сделать классический диалог поиска текста.не удается создать общий диалог поиска Windows

Я положил, что я знаю, что в этом, но не показывает любое окно и возвращает: 2147500037 0x80004005

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

int main() { 
    using namespace std; 
    UINT uFindReplaceMsg; // message identifier for FINDMSGSTRING 
    uFindReplaceMsg = RegisterWindowMessage(FINDMSGSTRING); 
    wstring search_str = L"text to search"; 
    HWND findDialog = NULL; 
    wchar_t szFindWhat[MAX_PATH]; 
    FINDREPLACEW fr; 
    ZeroMemory(& fr, sizeof(FINDREPLACEW)); 
    fr.lStructSize = sizeof(FINDREPLACEW); 
    fr.hwndOwner = NULL; 
    fr.lpstrFindWhat = szFindWhat; 
    fr.wFindWhatLen = MAX_PATH; 
    findDialog = FindTextW(&fr); 
    cout << GetLastError() << endl; 
    cout << hex << GetLastError() << endl; 
} 

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

+0

Согласно образцу по адресу http://msdn.microsoft.com/en-us/library/windows/desktop/ms646829(v=vs.85).aspx#finding_text, ваше приложение должно обрабатывать сообщения FINDMSGSTRING. Вы устанавливаете это, вызывая 'RegisterWindowMessage'. См. Образец. –

+0

Существует множество требований для использования общего диалога ** modeless **, управляемого с помощью ['FindText()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646918 (v = vs.85) .aspx), многие из которых вы не встречаете. Предлагаю вам ознакомиться с особенностями этого API. – WhozCraig

+0

Обновлен код, все еще не работает. То, что я пытаюсь достичь, - это сделать, пока окно появится. – rsk82

ответ

1

Вы не проверяете результат возврата от FindTextW. То есть у вас есть:

findDialog = FindTextW(&fr); 
cout << GetLastError() << endl; 

Если функция выполнена успешно, результатом будет ручка. Если функция не работает, возвращаемое значение равно NULL.

По the documentation:

Если функция завершается ошибкой, возвращаемое значение NULL. Чтобы получить расширенную ошибку , вызовите функцию CommDlgExtendedError. CommDlgExtendedError может возвращать один из следующих кодов ошибок:

Другими словами, GetLastError не буду говорить вам ничего значимого. Позвоните по номеру CommDlgExtendedErrorпосле вы проверяете ручку, чтобы увидеть, является ли она NULL.

+0

Я проверил это, CommDlgExtendedError является 0xFFFF, который является CDERR_DIALOGFAILURE, hmmm ... * Например, эта ошибка возникает, если общий вызов диалогового окна указывает неверный дескриптор окна. * - и Bingo здесь с этим диалоговым окном. HwndOwner - это должен, даже GetConsoleWindow() работает. Теперь диалог показывает, и я могу продолжать. (Это сообщение об ошибке является загадочным, оно должно четко указывать на дескриптор родительского окна. Эти причуды заставляют меня по-настоящему ненавидеть документацию winapi ненависти.) – rsk82