Я реализовываю небольшое приложение (наблюдатель), который должен "присоединиться" к нижней части другого (наблюдаемого) окна. Последний не является окном в приложении.
В данный момент я решил путем получения hWnd окна и запросов периодически в потоке местоположения наблюдаемого окна, перемещения окна наблюдателя соответственно.
Однако это - очень неэлегантное решение. То, что я хотел бы сделать, должно слушать изменить размер событие наблюдаемого окна так, чтобы наблюдатель реагировал только при необходимости.
Я предполагаю, что должен использовать рычаг, и я нашел много способов сделать его, но мое отсутствие знаний C WinAPI блокирует меня в понимании, которые сцепляются, я должен создать и как (pinvoke/parameters/etc).
Я вполне уверен, это довольно тривиально, и некоторые из Вас знакомый с C/C++, и WinAPI будет иметь ответ готовым под рукой ;)
Спасибо
Расширение ответа Криса Тейлора: вместо того, чтобы выполнять собственное взаимодействие самостоятельно, вы можете использовать ManagedWinApi , который содержит класс Hook
.
РЕДАКТИРОВАТЬ: использовать ManagedWinApi. Где-то в вашем коде:
Hook MyHook = new Hook(HookType.WH_CALLWNDPROC, false, false);
MyHook.Callback += MyHookCallback;
MyHook StartHook();
Для обратного вызова обратитесь к CallWndProc и CWPSTRUCT :
private static int MyHookCallback(int code, IntPtr wParam, IntPtr lParam, ref bool callNext)
{
if (code >= 0)
{
// You will need to define the struct
var message = (CWPSTRUCT)Marshal.PtrToStructure(lParam, typeof(CWPSTRUCT));
// Do something with the data
}
return 0; // Return value is ignored unless you set callNext to false
}
Хука WH_CALLWNDPROC
, вероятно, будет достаточно, это позволит вам отслеживать все сообщения, предназначенные для интересующего окна.
Вы спрашиваете, как создать глобальную ловушку, используя C #, или вы счастливы создать ловушку на C ++, а затем взаимодействовать с ней из .NET? Второй вариант - это маршрут, по которому я бы пошел.
По сути, я бы сделал следующее:
1- Создать глобальную ловушку на C и экспортировать функции в InstallHook
и UninstallHook
, которые можно вызвать из вашего приложения C # с помощью Interop. InstallHook берет hwnd окна в вашем приложении C #.
2- Попросите установленную функцию перехвата отправлять настраиваемое сообщение в окно C #, указанное в вызове InstallHook
, когда когда-либо появляется интересующее вас сообщение типа WM_SIZE
в вашем кейс.
3- В приложении C # ваше окно, которое принимает отправленные сообщения от ловушки, будет переопределять WndProc для обработки настраиваемого сообщения.
Это набросок одного подхода.