You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:06:09