При вызове из того же процесса, который создавал HotKey — все работает. Если вызвать с теми же параметрами из другого процесса — не работает, возращает false (GetLastError возвращает ошибку 2 — файл не найден). В MSDN ничего не сказано что вызывать нужно из того же процесса.
Re: UnregisterHotKey - почему не работает из другого процесса?
Здравствуйте, Shmj, Вы писали:
S>При вызове из того же процесса, который создавал HotKey — все работает. Если вызвать с теми же параметрами из другого процесса — не работает, возращает false (GetLastError возвращает ошибку 2 — файл не найден). В MSDN ничего не сказано что вызывать нужно из того же процесса.
А UnregisterHotkey в чужом процессе откуда берет HWND и id хоткея?
Здравствуйте, Carc, Вы писали:
C>А UnregisterHotkey в чужом процессе откуда берет HWND и id хоткея?
Для тестов сначала получаю HWND окна первого процесса вручную (в дебагере смотю при вызове RegisterHotKey и его же видно в Spy), id равен 1. Проверял несколько раз внимательно — в том числе и вызывал UnregisterHotkey и смотрел в дебагере что эти же HWND и id используются и все работает.
Если бы удалось запустить в другом процессе, то сейчас бы искал как программно получить HWND и id. Но нет, оно вообще не работает, даже если известны HWND и id.
Re: UnregisterHotKey - почему не работает из другого процесса?
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Carc, Вы писали:
C>>А UnregisterHotkey в чужом процессе откуда берет HWND и id хоткея?
S>Для тестов сначала получаю HWND окна первого процесса вручную (в дебагере смотю при вызове RegisterHotKey и его же видно в Spy), id равен 1. Проверял несколько раз внимательно — в том числе и вызывал UnregisterHotkey и смотрел в дебагере что эти же HWND и id используются и все работает.
S>Если бы удалось запустить в другом процессе, то сейчас бы искал как программно получить HWND и id. Но нет, оно вообще не работает, даже если известны HWND и id.
А толку? Эти данные могут быть чем угодно… Ну например какой нить ID процесса\треда + соль из HWND/id хоткея. Вызывая из своего процесса получаем другой PID, и всё данные не валидны. Как реализовано, это уже детали — пофиг-веники. Хоть тот же map, или же PID используется как некое смещение в некой таблице (ну вроде как HPROCESS во времена Win98).
Есть такая штука как Hotkey Commander, дык он вроде бы умеет читать чужие хоткеи. Я как-то интересовался этим вопросом давно. Где уж не помню, можь чего-то вроде StackOverflow что ли. Там была какая-то недокументированная функция, для получения всех хоткеев. По крайней мере какая-то левая структура точно была. Но дальше я не пошел. Правда, у меня не было задачи разрегать чужой хоткей, только узнать кто им владеет. Там был какой-то веселый метод, вроде как повесить глобальный хук, а потом через SendInput кликнуть клавишу, и посмотреть кто поймает WM_HOTKEY. Ну да та еще велосепедина.
Здравствуйте, CEMb, Вы писали:
CEM>Здравствуйте, Alexander G, Вы писали:
AG>>Да ну!
AG>>
AG>>
UnregisterHotKey function
AG>>Frees a hot key previously registered by the calling thread.
CEM>Т.е. даже не получится внедриться в родной процесс и разрегистрировать hotkey оттуда
С гуев ли не получится?
Наша внедренная процедурка, вроде того же SetWindowsHookEx и реализации в DLL, будет работать в контексте потока-цели, куда внедрились. Другой вопрос, что прям вот так вот Винда нам и разрешила куда ни попадя свои DLL внедрять
Здравствуйте, Carc, Вы писали:
CEM>>Т.е. даже не получится внедриться в родной процесс и разрегистрировать hotkey оттуда C>С гуев ли не получится? C>Наша внедренная процедурка, вроде того же SetWindowsHookEx и реализации в DLL, будет работать в контексте потока-цели, куда внедрились. Другой вопрос, что прям вот так вот Винда нам и разрешила куда ни попадя свои DLL внедрять
На тот гипотетический случай, если жадный процесс занял хоткей, но не крутит цикл сообщений, но пермишнов нам хватает, у нас всегда есть SetThreadContext, если что