Модификация старой программы Windows, чтобы не вызывать выход после нажатия клавиши без доступа к источнику - PullRequest
1 голос
/ 09 апреля 2010

У меня есть старая программа на C ++ для Windows, которую меня попросили запустить в среде с киосками для студенческого проекта. Из главного меню, нажав ESC, вы выйдете из программы, что нежелательно. В прежние времена я бы перехватил прерывание клавиатуры или что-то еще и покопался в NOOP, на что ссылались JMP или CALL в операторе case, который, вероятно, решает все это, но в Windows все проходит через различные зарегистрированные обработчики событий, и я не Выполнение любых работ по внутренним компонентам окон за 10 лет.

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

Ответы [ 2 ]

2 голосов
/ 09 апреля 2010

Если у вас есть HWND для окна, которое обрабатывает сообщение, вы можете перехватывать его сообщения, выборочно не доставляя определенные сообщения в процедуру «реального» окна.

Например:

/* Get the current window proc for this hwnd. */
WNDPROC OldWindowProc = (WNDPROC)GetWindowLongPtr(hWnd, GWLP_WNDPROC);

/* Set the window proc to your own override. */
SetWindowLongPtr(hWnd, GWLP_WNDPROC, (ULONG_PTR)MyWindowProc);

Тогда внутри MyWindowProc вы бы перехватили WM_KEYDOWN. Для всех других сообщений (и для WM_KEYDOWN s, которые вы хотите передать элементу управления), вы должны вызывать OldWindowProc (процедура окна, к которой у вас нет источника) через CallWindowProc.

Обновление: Не понял, что это EXE, который вы не можете изменить напрямую. Возможно, вам придется объединить эту технику с инъекцией DLL, упомянутой Маттео Может быть, вы можете внедрить свою DLL, получить HWND через FindWindow, а затем изменить процедуру окна, как я описал.

1 голос
/ 09 апреля 2010

Предполагая, что у вас нет исходников этой программы, вы можете внедрить созданную вами dll в процессе (со старым трюком CreateRemoteThread / LoadLibrary) и в подкласс DllMain главное окно. Теперь все, что вам нужно сделать, это отфильтровать WM_KEYDOWN и убить его (вы не можете вообще вызывать оригинальный wndproc или заменять его на WM_NULL); Вы также можете фильтровать сообщения WM_CLOSE, чтобы избежать других видов закрытых запросов. Вы можете получить подобный эффект также с крючками.

Подробнее о создании подклассов окна смотрите в ответе asveikau.

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