如何修改HWND属性?按下VK_INSERT关闭WS_EX_TRANSPARENT的方法
解决方案
要移除窗口的WS_EX_TRANSPARENT扩展样式,核心是用SetWindowLongPtrW修改扩展样式,再触发窗口刷新让变更生效。以下是具体实现步骤和代码:
1. 在窗口过程中捕获按键消息
你需要在窗口的消息处理函数(WindowProc)里处理WM_KEYDOWN消息,判断是否按下了VK_INSERT:
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_KEYDOWN: if (wParam == VK_INSERT) { // 执行移除透明样式的逻辑 RemoveTransparentStyle(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } return 0; }
2. 实现移除透明样式的函数
编写函数获取当前窗口扩展样式,移除目标位后重新设置,最后刷新窗口:
void RemoveTransparentStyle(HWND hwnd) { // 获取当前窗口的扩展样式 LONG_PTR exStyle = GetWindowLongPtrW(hwnd, GWL_EXSTYLE); // 精准移除WS_EX_TRANSPARENT位,保留其他样式 exStyle &= ~WS_EX_TRANSPARENT; // 应用新的扩展样式 SetWindowLongPtrW(hwnd, GWL_EXSTYLE, exStyle); // 刷新窗口让样式生效,SWP_FRAMECHANGED通知系统样式已变更 SetWindowPos(hwnd, nullptr, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); }
关键说明
GetWindowLongPtrW:通过GWL_EXSTYLE参数获取窗口当前的扩展样式集合。- 位运算
& ~WS_EX_TRANSPARENT:只清除WS_EX_TRANSPARENT对应的位,不会影响你之前设置的WS_EX_TOPMOST和WS_EX_LAYERED样式。 SetWindowPos:必须调用此函数并传入SWP_FRAMECHANGED,否则系统不会立即应用样式变更,窗口外观不会更新。
内容的提问来源于stack exchange,提问作者user19164169
相关产品推荐
相关产品推荐

