Rad Studio 12 VCL应用:互斥量恢复托盘窗口后最小化按钮失效
Rad Studio 12 C++ VCL应用:实例恢复后最小化按钮失效问题解决
问题场景
在Rad Studio 12的C++(Delphi/C++Builder)环境下使用VCL开发应用时,通过互斥量检测到已有实例运行并将其从系统托盘恢复至前台后,窗口能正常显示,但最小化按钮失效,窗口状态未完全更新。
初始实现代码
用于检测实例并恢复窗口的核心代码:
HANDLE hMutex; hMutex = OpenMutexA(MUTEX_ALL_ACCESS, 0, "Home-work-2025-0x1"); if(!hMutex) hMutex = CreateMutexA(0,0, "Home-work-2025-0x1"); else{ HWND hFirst = ::FindWindow(NULL, L"Home Work"); if(hFirst){ if(IsIconic(hFirst)){ ShowWindow(hFirst, SW_RESTORE); SetForegroundWindow(hFirst); }else SetForegroundWindow(hFirst); } else return(-2); return(2); } Application->Initialize(); Application->MainFormOnTaskBar = true; Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); ReleaseMutex(hMutex);
无效的修复尝试
尝试以下多种方法均无法解决最小化按钮失效问题:
WINDOWPLACEMENT wp; wp.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(hFirst, &wp); wp.showCmd = SW_RESTORE; SetWindowPlacement(hFirst, &wp); LONG style = GetWindowLong(hFirst, GWL_STYLE); if (!(style & WS_MINIMIZEBOX) || !(style & WS_SYSMENU)) { style |= WS_MINIMIZEBOX | WS_SYSMENU; SetWindowLong(hFirst, GWL_STYLE, style); } RedrawWindow(hFirst, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE); UpdateWindow(hFirst); SendMessage(hFirst, WM_ACTIVATE, WA_ACTIVE, 0); SetWindowPos(hFirst, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER); SetActiveWindow(hFirst); MSG msg; while (PeekMessage(&msg, hFirst, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } PostMessage(hFirst, WM_SYSCOMMAND,SC_RESTORE, 0);
关键观察
当最小化按钮失效且窗口已恢复时,点击托盘图标右键菜单的“显示/隐藏”选项(对应代码如下),可立即修复按钮状态,使其恢复正常:
if(Form1->WindowState == wsMinimized){ Form1->WindowState = wsNormal; Form1->Show(); }else if(Form1->WindowState == wsNormal){ Form1->WindowState = wsMinimized; }
最终有效解决方法
为主窗体添加FormPaint事件处理,在事件中调用Form1->Show():
void __fastcall TForm1::FormPaint(TObject *Sender) { Form1->Show(); }
内容的提问来源于stack exchange,提问作者user30130283
相关产品推荐
相关产品推荐

