Слушание другого окна изменяет размер событий в C#

Я реализовываю небольшое приложение (наблюдатель), который должен "присоединиться" к нижней части другого (наблюдаемого) окна. Последний не является окном в приложении.

В данный момент я решил путем получения hWnd окна и запросов периодически в потоке местоположения наблюдаемого окна, перемещения окна наблюдателя соответственно.

Однако это - очень неэлегантное решение. То, что я хотел бы сделать, должно слушать изменить размер событие наблюдаемого окна так, чтобы наблюдатель реагировал только при необходимости.

Я предполагаю, что должен использовать рычаг, и я нашел много способов сделать его, но мое отсутствие знаний C WinAPI блокирует меня в понимании, которые сцепляются, я должен создать и как (pinvoke/parameters/etc).

Я вполне уверен, это довольно тривиально, и некоторые из Вас знакомый с C/C++, и WinAPI будет иметь ответ готовым под рукой ;)

Спасибо

21
задан Steve Vedovelli 21 May 2010 в 07:06
поделиться

2 ответа

Расширение ответа Криса Тейлора: вместо того, чтобы выполнять собственное взаимодействие самостоятельно, вы можете использовать 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
}
8
ответ дан 29 November 2019 в 21:57
поделиться

Хука WH_CALLWNDPROC , вероятно, будет достаточно, это позволит вам отслеживать все сообщения, предназначенные для интересующего окна.

Вы спрашиваете, как создать глобальную ловушку, используя C #, или вы счастливы создать ловушку на C ++, а затем взаимодействовать с ней из .NET? Второй вариант - это маршрут, по которому я бы пошел.

По сути, я бы сделал следующее:

1- Создать глобальную ловушку на C и экспортировать функции в InstallHook и UninstallHook , которые можно вызвать из вашего приложения C # с помощью Interop. InstallHook берет hwnd окна в вашем приложении C #.

2- Попросите установленную функцию перехвата отправлять настраиваемое сообщение в окно C #, указанное в вызове InstallHook , когда когда-либо появляется интересующее вас сообщение типа WM_SIZE в вашем кейс.

3- В приложении C # ваше окно, которое принимает отправленные сообщения от ловушки, будет переопределять WndProc для обработки настраиваемого сообщения.

Это набросок одного подхода.

4
ответ дан 29 November 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: