Чистые win32 кросс-процессные дочерние окна - PullRequest
2 голосов
/ 18 мая 2009

Мне нужно создать прозрачное оверлейное окно, которое выходит над другим окном. Другое окно от другого поставщика. И когда пользователь перетаскивает , моё окно должно следовать за .

WS-CHILD кажется хорошей идеей, но ее нельзя сочетать с WS-EX-LAYERED, , которая мне действительно нужна (для прозрачности). Но я все еще могу установить родителя без использования WS-CHILD.

Воспитание выдает мои уведомления winproc (WM-WINDOWPOSCHANGING), но только после завершения перетаскивания при наведении мыши. Чтобы создать приятное ощущение, мне нужно получать эти уведомления (или, например, WM-MOVE) непрерывно при перетаскивании.

Я полагаю, что моя проблема похожа на стыковку, но отличное решение для стыковки, замеченное в CodeProjet, использует WS-CHILD. (http://www.codeproject.com/KB/toolbars/dockwnd.aspx)

Полагаю, я мог бы использовать опрос, но это не то, что я искал. Также я мог бы использовать :: SetWindowsHook (). Но это мой последний курорт. Я надеюсь, что упустил что-то тривиальное и что кто-то может указать мне правильное направление.

Thanx

Ответы [ 4 ]

4 голосов
/ 18 мая 2009

Я знаю, что это не ваше предпочтительное решение, но я думаю, что вам нужно использовать глобальную мышиную ловушку. Передайте WH_MOUSE_LL в SetWindowsHookEx() и ничего не делайте в случае по умолчанию для вашей низкоуровневой мышиной процедуры. Но когда вы получите уведомление WM_WINDOWPOSCHANGING, начните отслеживать движения мыши и делать соответствующие вызовы на MoveWindow() или что-то еще.

1 голос
/ 03 июня 2009

Я использую LayeredWindow для этого и устанавливаю другое окно как родительское.

Это код, который я использовал для этого:

::SetWindowLong(GetHwnd(), GWL_EXSTYLE, GetWindowLong(GetHwnd(), GWL_EXSTYLE) |WS_EX_LAYERED);
::SetLayeredWindowAttributes(GetHwnd(), RGB(255,0,255), 255, LWA_COLORKEY | LWA_ALPHA);
::SetWindowLongPtr(GetHwnd(),GWLP_HWNDPARENT,(long)GetParentHWND());
::SetWindowPos(hndOtherWindow, hndOverlayWinow, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE |SWP_NOACTIVATE);

Это работает для моих целей. Осталась только одна проблема: если мое наложенное окно теряет фокус, я хочу установить фокус или активировать другое окно. У вас есть идея?

0 голосов
/ 26 мая 2009

Если вы хотите знать, когда окно в другом процессе перемещается или изменяется, вам нужно установить хук, перехватить сообщения WM_MOVING и WM_SIZING и отразить эти сообщения обратно в процесс вашего контроллера. Извините, это не тот ответ, который вы хотите! Я не виню вас за то, что вы хотите избежать перекрестных перехватов, это немного болезненно ...

0 голосов
/ 21 мая 2009

Как насчет сообщения WM_MOVING? Вы можете попытаться перехватить это сообщение и соответственно переместить ваше окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...