Передача указателя this в MouseProc из SetWindowsHookEx - PullRequest
1 голос
/ 16 апреля 2019

Обычно, когда мы хотим обернуть Window / Thread в объекте C ++, мы делаем это, передавая указатель this через SetWindowLong/GetWindowLong или SetProp/GetProp для Window и как lpParameter для CreateThread /etc.

Мой вопрос относится к крючкам. Каков элегантный подход для передачи указателя 'this' в процедуры обратного вызова SetWindowsHookEx , или другими словами Как обернуть процедуру обратного вызова хука?

Поскольку SetWindowsHookEx не принимает аргумент UserData , я не вижу много вариантов, кроме использования неинкапсулированных, т.е. глобальных / статических / TLS данных.

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

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

Если вы разрабатываете библиотеку, допускающую несколько экземпляров хука, которые можно динамически добавлять или удалять, не делайтедобавить несколько хуков на уровне ОС.Вместо этого добавьте процедуру подключения уровня библиотеки, которая обходит список экземпляров подключения.Поскольку вы поддерживаете этот список, вы можете отслеживать любые «пользовательские данные» рядом с каждой записью, которую вы хотите.

1 голос
/ 16 апреля 2019

«Самый элегантный подход» - это использование thunk .Это небольшой фрагмент кода, сгенерированный во время выполнения и содержащий ваш указатель this.Это подход, который ATL использует даже для обычных окон.

См.

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