2015-09-03 1 views
0

Как мне получить мое окно для регистрации mouseclicks, даже tho ws_ex_transparent включен?Регистрация mouseclicks с ws_ex_transparent active C++

HWND hWnd = CreateWindowEx(WS_EX_LAYERED| WS_EX_TRANSPARENT, szAppName, wcWndName, 
    WS_VISIBLE | WS_POPUP, 255, 150, w, h, 
    NULL, NULL, hThisInst, NULL); 

окно попадет быть слоистыми и прозрачными, наряду с

SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_FRAMECHANGED); 

поместив его «верхний» (Infront) делает его работу в качестве наложения, но, к сожалению, оно не регистр клик мышей вообще ,

case WM_LBUTTONDOWN: 
    PostQuitMessage(0); //does it listen? 

Так что мой вопрос прост: Как мне получить слоистые, верхний, прозрачное окно, чтобы зарегистрировать меня щелчком мыши?

Любая помощь была бы полезной. благодаря


Решение оказывается с помощью достаточно стандартной функции крюк, включенную в заголовке окна.

Ключ для клавиатуры выглядит немного иначе, чем mousehook, но поскольку im после mousehook, это решение im posting. (Если и случится искать a keyboard hook)

mousehook; //global declaration 
LRESULT CALLBACK HookCallback(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
PKBDLLHOOKSTRUCT k = (PKBDLLHOOKSTRUCT)(lParam); 
    if (wParam == WM_LBUTTONDOWN) 
{ 
MessageBox(NULL, "LM is pressed", "key pressed", MB_ICONINFORMATION); 
} 
    if (wParam == WM_RBUTTONDOWN) 
{ 
MessageBox(NULL, "RM is pressed", "key pressed", MB_ICONINFORMATION); 
} 
return CallNextHookEx(Mousehook, nCode, wParam, lParam); 
} 

и назвав его в WinMain (до сообщ)

Mousehook = SetWindowsHookEx(WH_MOUSE_LL, HookCallback, NULL, 0); 
+0

Как и путаница над 'WS_EX_TRANSPARENT', если ваше окно на самом деле 100% прозрачно (т. Е. Его альфа-значение равно 0), то он все равно не увидит никакого ввода мыши. Вы можете дать ему альфа-значение 1, что приводит к тому, что оно будет эффективно невидимым, но будет регистрировать ввод мыши как обычное окно. –

+0

Im в настоящее время способен нарисовать круг, но я хочу, чтобы он рисовал разные вещи, когда нажимал кнопку мыши. Я не знаю, что именно означает изменение альфа-значения, для чего? функция createwindow? или мой glclear()? без ws_ex_layered, он становится черным, или не имеет ws_ex_transparent (чтобы разрешить прокрутку) – Charlie

+0

Итак, вы не используете 'SetLayeredWindowAttributes'? В этом случае у вас нет действительно прозрачного окна, у вас просто окно, которое ничего не рисует. –

ответ

1

Почему вы смешивания WS_EX_LAYARED и WS_EX_TRANSPARENT вместе, вместо того, чтобы использовать Многоуровневая прозрачность?

В любом случае, в этой статье некоторую информацию о том, что WS_EX_TRANSPARENT фактически делает:

Like the cake, WS_EX_TRANSPARENT is a lie, or at least not the entire truth

За то, что вы просите, вам нужно обрабатывать WM_NCHITTEST и иметь его вернуть HTCLIENT вместо HTTRANSPARENT для любого области, которую вы хотите кликать по прозрачному окну. Однако WM_NCHITTEST не работает с WS_EX_LAYERED, поэтому вам нужно будет удалить WS_EX_LAYERED и использовать WS_EX_TRANSPARENT самостоятельно, а затем обработать WM_ERASEBKGND и вернуть его 1 без рисования чего-либо, чтобы получить прозрачный эффект. Затем вы можете использовать WM_NCHITTEST.

+0

Окно не остается полупрозрачным без ws_ex_layered, и мне нужно это, чтобы заставить мой оверлей работать. stopping erasebgr не оставляет фон прозрачным, чтобы смешиваться, но черный – Charlie

+0

Опять же, вы не должны смешивать 'WS_EX_LAYERED' и' WS_EX_TRANPARENT' вместе. Полупрозрачное окно не является полностью прозрачным, поэтому вы можете просто щелкнуть по нему, если вы не нажмете на прозрачную область. Если вам нужно смешивать прозрачность и прозрачность вместе в одном окне, используйте для этого альфа-смешение на пиксель. –

+0

без ws_ex_layered, я не могу получить его полупрозрачным, и без ws_ex_transparent он не позволит прокручивать клики. В идеале этот оверлей будет слушать mouseclicks, в то же время позволяя им пройти. Я мог бы быть в моей голове здесь, hm, я бы не знал, как идти о достижении пиксельного альфа-смешивания с winapi и opengl. heres a pastebin, если вам нравится смеяться http://pastebin.com/6AZ56fWZ – Charlie

 Смежные вопросы

  • Нет связанных вопросов^_^