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
相关产品推荐
相关产品推荐

