C # - получить событие из SetWindowText - PullRequest
1 голос
/ 10 ноября 2009

Мы пишем плагин для существующего приложения VB6 (через COM-взаимодействие), и нам требуются некоторые функции, которые они не поддерживают. Мы могли бы легко получить требуемую функциональность, если бы могли каким-то образом получать событие, когда текст определенного элемента управления в их окне изменяется.

Мы уже можем взять их существующий дескриптор окна элемента управления с помощью FindWindow и получить текст с помощью GetWindowText.

Есть ли какой-нибудь неуправляемый метод / pinvoke для получения события при изменении текста в окне?

Мы не хотим опрашивать с помощью цикла while - мы можем захотеть сделать это на некоторых из их элементов управления в будущем.

PS - я знаю, что есть способы перехватывать вызовы p / invoke (google EasyHook), но мы не хотим перехватывать каждый вызов SetWindowText. Мы просто хотим получить его для одного элемента управления, и использование чего-то вроде EasyHook, вероятно, добавляет ненужную сложность.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2009

Вы можете попробовать создать новый класс в c #, производный от NativeWindow.

Переопределите функцию WndProc, и если сообщение типа WM SETWINDOWTEXT добавит вашу функциональность - игнорируйте все остальные сообщения и вызовите реализацию базового класса

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM SETWINDOWTEXT:
            // Custom code here
            break;
    }
    base.WndProc(ref m);
}

Создайте экземпляр этого класса C # и вызовите функцию AssignHandle с hWnd для элемента управления, который вы получили с FindWindow.

См. Эту ссылку для получения дополнительной информации и более подробного объяснения: Переопределение WndProc в классе NativeWindow

1 голос
/ 10 ноября 2009

Для общих окон такого события нет. Если элемент управления является элементом редактирования, он может отправить EN_CHANGE через WM_NOTIFY своему родителю, однако вы не можете внедрить управляемый код в другой процесс для перехвата уведомления. Я предлагаю вам связаться с автором приложения VB6, чтобы добавить для вас COM-событие, или отказаться от требования уведомления.

...