C ++ - 具有特定退出代码的CloseWindow

时间:2017-01-08 22:51:47

标签: c++ winapi wndproc

有没有办法关闭返回特定代码的窗口?我知道PostQuitMessage()允许你发布应用程序的退出代码,但每次我在我的线程中调用PostQuitMessage()时窗口都会挂起。我需要能够使用将被赋予调用进程的特定代码退出GUI。

我有一个安装程序类,它打开一个窗口并等待WndProc(用户回答的相同线程取决于线程是否继续执行)发送WM_EXIT返回值并取决于用户选择的内容(0表示成功安装)(1表示用户取消或安装失败)将确定应用程序将从那里做什么。

这里有一些代码可以给你一个想法,有些语法可能不正确,因为我在StackOverFlow编辑器中键入了除WndProc之外的所有内容。

(顺便说一句,你可能会问为什么你可以强制下载而不是让用户决定,如果发现一个巨大的漏洞可能会被恶意使用,以便你在允许他们有机会找到它之前修补它,我从微软那里得到了这个想法,因为有时它们需要你更新)

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

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

DLL Source(Trimmed):

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;
}

主窗口

 int main(){

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

 return 0;
}

2 个答案:

答案 0 :(得分:0)

ExitProcess()指定最终退出代码。当CreateUpdateWindow()返回1时,您传递0.您需要传递1:

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

答案 1 :(得分:0)

我通过使用对话框解决了我的问题。我正在创建一个显示更新信息的窗口,但正如Harry Johnston所说,我应该使用一个对话框来实现这样的事情。

当你用“DialogBox”生成对话框时,它在一分钟内解决了我的问题,返回代码是你在“EndDialog”中给出的值(对话框proc内部)

如图所示:

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;
}