2017-01-08 2 views
-2

Есть ли способ закрыть окно, возвращающее конкретный код? Я знаю, что PostQuitMessage() позволяет публиковать код выхода приложения, но каждый раз, когда я вызываю PostQuitMessage(), в моем потоке зависает окно. Мне нужно иметь возможность выйти из моего графического интерфейса с определенным кодом, который будет передан вызывающему процессу.C++ - CloseWindow with specificc code

У меня есть класс установщика, который открывает окно и ждет, когда WndProc (тот же поток, что и пользователи, зависит от того, будет ли поток продолжен выполняться или нет), чтобы отправить возвращаемое значение WM_EXIT и в зависимости от того, что пользователь выбирает (0 для успешной установки) (1 для пользователя, отменившего или неудачную установку) определит, что приложение будет делать оттуда.

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

(Кстати, вы можете спросить, почему вы можете принудительно скачать вместо того, чтобы позволить пользователям решить, ну а что, если была обнаружена огромная уязвимость, которую можно было бы использовать злонамеренно, чтобы вы ее исправляли, прежде чем позволить им найти ее Я получил идею от Microsoft, потому что иногда они требуют, чтобы обновить)

int CreateUpdateWindow(){ 
    //MessageLoop function 
    //Calls WndProc 

    //return exit code 
    return static_cast<int>(msg.wparam); 
} 

DLL Источник (Обработанный):

LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 

switch (uMsg) { 

case WM_COMMAND:{ 

    switch (LOWORD(wParam)) { 

    case UpdateButton: { 
     //User installs update 
     PostQuitMessage(0); 
     break; 
    } 

    case CancelButton: { 
     //User declines update 
     PostQuitMessage(1); 
     break; 
    } 


    } 


    break; 
} 

case WM_DESTROY: { 
    PostQuitMessage(1); 
    break; 
} 


default: { 
    return DefWindowProc(hWnd, uMsg, wParam, lParam); 
} 

} 


    return 0; 
} 

Main Window

int main(){ 

    //Did the user cancel the install? 
    //If he did exit the main process 
if (CreateUpdateWindow() == 1){ 
    ExitProcess(0); 
} 

return 0; 
} 
+0

вам нужно связать некоторые данные окна (скажем экземпляр класса), и в этих данных вы можете сохранить причину, почему окна сл osed. и использовать эти данные после закрытия окна – RbMm

+0

Или, если вас не волнует элегантность, вы можете просто использовать глобальную переменную. –

+0

... но действительно непонятно, что вы здесь задаете. Похоже, вы хотите выйти из приложения с определенным кодом выхода, который родительский процесс может прочитать, но ваш комментарий к ответу Реми предполагает иное. Вы просто пытаетесь вернуть результат из оконной процедуры в main(), то есть замените код, который говорит 'return ... msg.wparam', что-то, что действительно работает? –

ответ

0

ExitProcess() указывает окончательный код выхода. Вы передаете 0, когда CreateUpdateWindow() возвращает 1. Вы должны пройти 1 вместо:

//Did the user cancel the install? 
//If he did exit the main process 
if (CreateUpdateWindow() == 1){ 
    ExitProcess(1); 
} 
+0

Спасибо, но это было не то, что мне нужно, мне нужно получить код выхода WndProc (ответ зависит от того, что пользователь выбирает), а затем проверить, что он находится в «Main», который задается возвратом «CreateUpdateWindow» –

+0

@ TrevinCorkery, тогда я полностью потерял то, о чем вы действительно просите. –

0

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

Это решило мою проблему в течение одной минуты, как вы нерест ваш диалог с «DialogBox» и код возврата значение вы даете его в «EndDialog» (Внутри диалогового прок)

Как показано:

INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { 

    switch (uMsg) { 

    case WM_SHOWWINDOW: { 

    case WM_COMMAND: { 
     switch (LOWORD(wParam)) { 
     case IDC_UPDATE: { 
      EndDialog(hWnd, 1); 
      break; 
     } 

     case IDC_CANCEL: { 
      EndDialog(hWnd, 0); 
      break; 
     } 
     } 

     break; 
    } 


    default: 
     return DefWindowProc(hWnd, uMsg, wParam, lParam); 
    } 



    return 0; 
} 

Функция где я вызываю диалоговое окно и ждать возвращаемого значения

int Adaptify::PromptInstall() { 

    LoadLibrary(L"Riched20.dll"); 
    INT_PTR ReturnCode = DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), nullptr, DlgProc); 
    //ReturnCode is the value you gave it via EndDialog 
    return 0; 
}