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

C#向外部应用窗口添加的按钮仅显示2-3秒后消失,如何解决?

问题原因及解决方法

消失原因

  • 原代码的创建线程执行完毕后直接退出,按钮所属的线程资源被释放,导致按钮随之销毁
  • 未处理目标窗口的重绘逻辑,当目标窗口刷新时,按钮被窗口的重绘操作覆盖
  • 按钮的窗口属性未正确配置,无法持续依附于目标窗口的消息循环

解决步骤

1. 维持按钮的消息循环

创建按钮后,不要立即结束线程,而是启动消息循环来保持按钮的生命周期:

// 创建按钮后添加消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

2. 确保按钮正确依附目标窗口

创建按钮时,明确指定父窗口为目标窗口句柄,并设置正确的窗口样式:

HWND hButton = CreateWindow(TEXT("BUTTON"), TEXT("My Button"), 
    WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,
    10, 10, 100, 30,
    hTargetWindow, // 替换为你的目标窗口句柄
    (HMENU)1, 
    GetModuleHandle(NULL), 
    NULL);

3. 处理目标窗口重绘(可选)

如果目标窗口频繁重绘导致按钮被覆盖,可以子类化目标窗口,在重绘后强制刷新按钮:

WNDPROC oldProc;
HWND hButton; // 全局或可访问的按钮句柄

LRESULT CALLBACK SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    if (uMsg == WM_PAINT) {
        LRESULT result = CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam);
        // 重绘按钮
        InvalidateRect(hButton, NULL, TRUE);
        UpdateWindow(hButton);
        return result;
    }
    return CallWindowProc(oldProc, hwnd, uMsg, wParam, lParam);
}

// 创建按钮后执行子类化
oldProc = (WNDPROC)SetWindowLongPtr(hTargetWindow, GWLP_WNDPROC, (LONG_PTR)SubclassProc);

4. 绑定按钮生命周期到目标窗口

在消息循环中判断目标窗口是否存在,仅当目标窗口关闭时才退出循环并销毁按钮:

// 消息循环中检查目标窗口状态
while (IsWindow(hTargetWindow) && GetMessage(&msg, NULL, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
// 目标窗口关闭后清理按钮
if (IsWindow(hButton)) {
    DestroyWindow(hButton);
}

内容的提问来源于stack exchange,提问作者DonCorleone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:42:11