Как прослушать «Form.Shown» и «Window.Closing» для формы из сторонней библиотеки DLL? - PullRequest
0 голосов
/ 10 июня 2019

Мое приложение C # вызывает стороннюю DLL.Эта DLL может показывать или не отображать окно (форму).Я хочу зарегистрироваться для обратного вызова / уведомления / события, когда это окно отображается, и другого, когда окно закрыто (с помощью X или кнопки «Закрыть»).Бонус, если я могу сказать имя кнопки, которая вызвала действие (то есть: я сделаю что-то другое, если они нажмут «Закрыть» или «X», по сравнению с тем, если они нажмут «Купить»)

Iне имеют доступа к исходному коду этой DLL, а в заголовках не указываются формы.

Возможно ли то, что мне нужно?

Если вам интересно, это для PaddleSDK

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Хорошо, похоже, это работает: (спасибо всем за подсказки !!)

    private int[]           i_checkoutWindID;

    private void    RegisterEventListener()
    {
        Automation.AddAutomationEventHandler(
            WindowPattern.WindowOpenedEvent,
            AutomationElement.RootElement,
            TreeScope.Children,
            (sender, e) => 
        {
            AutomationElement       element = sender as AutomationElement;
            string                  automationID = element.Current.AutomationId;

            if (automationID != kLicenseWindowAutomationID) return;

            i_checkoutWindID = element.GetRuntimeId();

            AutomationElement licenseButton = element.FindFirst(
                TreeScope.Descendants,
                new PropertyCondition(AutomationElement.AutomationIdProperty, kLicenseButtonAutomationID));

            if (licenseButton != null) {
                IntPtr      hwnd = new IntPtr(licenseButton.Current.NativeWindowHandle);
                Control     buttonRef = Control.FromHandle(hwnd);

                HideButton_Safe(buttonRef);
            }
        });

        Automation.AddAutomationEventHandler(
            WindowPattern.WindowClosedEvent,
            AutomationElement.RootElement,
            TreeScope.Subtree,
            (sender, e) => 
        {
            WindowClosedEventArgs       args = e as WindowClosedEventArgs;

            if (Automation.Compare(args.GetRuntimeId(), i_checkoutWindID)) {
                Array.Clear(i_checkoutWindID, 0, i_checkoutWindID.Length);
                <do your "window closed" callback here>;
            }
        });
    }

    private void HideButton_Safe(Control buttonRef)
    {
        if (buttonRef.InvokeRequired) {
            var d = new SafeCallDelegate_ButtonHide(HideButton_Safe);
            buttonRef.Invoke(d, new object[] { buttonRef });
        } else {
            buttonRef.Hide();
        }
    }
0 голосов
/ 10 июня 2019

Использование SetWinEventHook

Интернет полон глупых способов сделать это, но это верный путь. Опрос плох (м'кей?).

Если вы будете искать в StackOverflow SetWinEventHook и искать хиты c #, вы найдете множество примеров для использования.

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