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

如何修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 07:01:02