【问题标题】:How to get focus back on transparent (ClickThrough enabeled) Window如何让焦点重新回到透明(启用点击)窗口
【发布时间】:2018-07-23 14:05:30
【问题描述】:

我正在开发一个窗口最初是透明的应用程序,然后在按键上(比如shift+tab)窗口应该是 ClickThrough。我用来获取ClickThrough 的代码如下:

_hwnd = CreateWindowEx(WS_EX_LAYERED | WS_EX_TRANSPARENT, 
            TEXT("Example"), 
            title, WS_BORDER,
            GetSystemMetrics(SM_CXSCREEN) / 2 - _width / 2,
            GetSystemMetrics(SM_CYSCREEN) / 2 - _height / 2,
            _width, _height,
            NULL, NULL,
            NULL, NULL);
int opacity = 70;
SetLayeredWindowAttributes(_hwnd, 0, (255 * opacity) / 100, LWA_ALPHA); 

现在,有什么解决方案可以 ClickThrough?我用谷歌搜索,但没有找到任何人。

【问题讨论】:

  • 你在说“不是 ClickThrough”吗?
  • 是 C 还是 C++?
  • C 或 C++ 在这里无关紧要
  • 嗯,那不是透明窗口。已经有一个不错的替代窗口,它是透明的、可点击的并且不能通过点击来聚焦:不要创建它。使用 RegisterHotKey() 来识别击键。
  • 是否可以将焦点对准窗口..?

标签: c++ c winapi alpha-transparency click-through


【解决方案1】:

是的,我已经通过注册 HotKeys 做到了这一点:WndProc 如下:

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    switch (message)
    {
    //break;
    case WM_HOTKEY:
    {
        switch (wparam)
        {
        case 1:// Close Window
            PostQuitMessage(0);
            break;
        case 2://Disable ClickThrough
            SetWindowLong(hwnd, -20, WS_EX_LAYERED); //-16 for window style
            break;
        case 3://enable ClickThrough
            SetWindowLong(hwnd, -20, WS_EX_LAYERED | WS_EX_TRANSPARENT); 
            break;
        }
    }
    break;
    case WM_CLOSE:
    {
        DestroyWindow(hwnd);
        return 0;
    }
    break;
    default:
        return DefWindowProc(hwnd, message, wparam, lparam);
    }


}

如下注册HotKeys

RegisterHotKey(_hwnd, 1, MOD_SHIFT, 0x43); //shift + c
RegisterHotKey(_hwnd, 2, MOD_SHIFT, 0x44); //shift + d
RegisterHotKey(_hwnd, 3, MOD_SHIFT, 0x45); //shift + e

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多