有没有办法关闭返回特定代码的窗口?我知道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;
}
答案 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;
}