C++中Windows消息框路径异常及窗口重连重试失效问题咨询
解答你的两个C++ Windows编程问题
问题1:为什么我的C++程序中Windows消息框总是默认选中某个按钮?(推测你可能表述时打错了“路径”,应为“选项/按钮”)
首先,Windows消息框的默认选中按钮是由MessageBoxA的调用参数决定的。默认情况下,MessageBox会把第一个按钮设为默认选中项(比如MB_RETRYCANCEL组合里,默认就是重试按钮)。
如果你想修改默认选中的按钮,可以在参数里追加对应的标识:
MB_DEFBUTTON1:默认第一个按钮(默认行为,无需显式添加)MB_DEFBUTTON2:默认第二个按钮(比如MB_RETRYCANCEL里的取消按钮)MB_DEFBUTTON3:默认第三个按钮(仅当消息框有三个按钮时生效)
举个例子,若想让取消按钮成为默认选中项,调用代码可修改为:
const int Window = MessageBoxA(0, "Failed to attach Window!", "Attention", MB_RETRYCANCEL | MB_ICONERROR | MB_DEFBUTTON2);
如果我理解错了你的问题(比如你确实是指“路径”相关场景),可以补充更多细节,我再帮你调整解答~
问题2:重试附加窗口时总是提示未找到进程
你的代码存在一个关键逻辑漏洞:hwnd作为类成员变量,它的初始化HWND hwnd = FindWindowA(NULL, "SONIC HEROES(TM)");只会在类对象创建时执行一次。当第一次查找失败后,即便用户打开了目标窗口,重试调用attempt()时,hwnd还是保留着最初的NULL值——你根本没有重新去查询窗口状态!
解决方法很简单:把FindWindowA的调用移到attempt()函数内部,让每次重试都重新获取最新的窗口句柄。修改后的代码如下:
class attach { DWORD ProcID; // 仅声明hwnd,不在类初始化时赋值 HWND hwnd; void attempt() { // 每次尝试都重新查找目标窗口 hwnd = FindWindowA(NULL, "SONIC HEROES(TM)"); if (hwnd == NULL) { const int Window = MessageBoxA(0, "Failed to attach Window!", "Attention", MB_RETRYCANCEL | MB_ICONERROR); switch (Window) { case IDRETRY: attempt(); break; case IDCANCEL: exit(-1); break; } } else { // 找到窗口时用成功类图标更合适,替换原来的MB_ICONHAND MessageBoxA(0, "Window Found!", "Attention", MB_OK | MB_ICONINFORMATION); // 这里可以补充获取进程ID的逻辑,比如: // GetWindowThreadProcessId(hwnd, &ProcID); } } };
另外提个小细节:你原来在成功提示里用了MB_ICONHAND(错误图标的别名),换成MB_ICONINFORMATION会更符合成功场景的视觉反馈~
内容的提问来源于stack exchange,提问作者Drake
相关产品推荐
相关产品推荐

