点击透明窗口,不允许拖动[C ++]

时间:2015-07-09 09:35:17

标签: c++ user-interface winapi click window

使用.NET有几种方法可以做到这一点(例如,以this为例),但我只能使用C ++ win32重现同样的事情。

我的方法是使用WS_EX_LAYERED然后使用SetLayeredWindowAttributes来控制不透明度,但我读了更多,我发现WS_EX_TRANSPARENT更好' - 它允许点击 - 通过。

然而,使用

hWnd = CreateWindowEx(WS_EX_TRANSPARENT, fooName, fooName, WS_OVERLAPPEDWINDOW | WS_POPUP | WS_CLIPSIBLINGS, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

似乎没有做到这一点。还有另外一件事:一旦我点击了点击窗口,我可以使用

PostMessage(hWnd, WM_LBUTTONUP, 0, MAKELPARAM(GET_X_LPARAM(lParam) ,GET_Y_LPARAM(lParam)));

阻止拖动状态通过?

注意:使用触摸板设备生成拖动状态。

2 个答案:

答案 0 :(得分:4)

点击型部分:

事实上,WS_EX_TRANSPARENT本身就是一个很大的谎言;所以我用了WS_EX_COMPOSITED | WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST代替。

我使用SetLayeredWindowAttributes(hWnd, 0, (255 * opacity) / 100, LWA_ALPHA);控制不透明度(非常不正统,但它有效)我也使用

SetCapture(hWnd);
ShowCursor(false);

抓住鼠标焦点,因为顶级窗口不会松开并隐藏光标。

我还试图强调关注添加WM_NCACTIVATEWM_ACTIVEAPP的窗口:

case WM_MOUSEMOVE:
        fprintf(stdout, "Mouse move [%d][%d]\n", GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));
        SetForegroundWindow(hWnd);
        break;

case WM_LBUTTONDOWN:
        printf("Mouse click\n");
        SetForegroundWindow(hWnd);
        break;

case WM_NCACTIVATE:
        return false;

case WM_ACTIVATEAPP:
        wActive = (bool)wParam;

        if(wActive == false)
            return 0;
        else
            return DefWindowProc(hWnd, message, wParam, lParam);

拖动部分:

在我的特殊情况下,我想“捅”'下面的窗口(子窗口)没有失去焦点;不幸的是,任何鼠标点击事件都会将焦点更改为该子窗口 - 解决方案是:

  1. 设置一个计时器(SetTimerWM_TIMER)并检查您的应用程序是否失去焦点
  2. 为您的窗口设置一个挂钩并使用WM_KILLFOCUS消息回复WM_SETFOCUS消息

答案 1 :(得分:2)

我最近一直致力于创建具有透明度和点击性能的窗口,我只是尝试了这个:

HWND hWnd = CreateWindowEx(WS_EX_LAYERED|WS_EX_TRANSPARENT, cName, wTitle, NULL, 0, 0, 640, 480, NULL, 0, GetModuleHandle(NULL), 0);

您无法关闭它,最小化它,拖动它等等 - 您所做的每次点击都会直接通过,就好像它不存在一样。 然后使用以下方法更改透明度:

SetLayeredWindowAttributes(hWnd, 0, 100, LWA_ALPHA);

如果我理解正确的话,它会实现你问题中的所有内容。

您的方法可能无效,因为如果您使用WS_EX_LAYERED,则必须定义WS_EX_TRANSPARENT