Подклассы, по моему мнению, - это то, что вы ищете.
Когда создается приложение Windows, оно генерирует окно, а затем добавляет к этому окну суб-Windows (суб-Windows называется Controls и actТочно так же, как Windows! Это могут быть кнопки, текстовые области и т. Д.).
В каждом окне есть оконная процедура, и каждый раз, когда пользователь / программа взаимодействует с вашим окном, ваша оконная процедура будет получать сообщение, содержащее информацию о взаимодействии.Довольно часто элементы управления совместно используют одну оконную процедуру со своим родителем, и внутри этой оконной процедуры код определяет, что делать, исходя из идентификатора (hwnd) окна / элемента управления, который описывает сообщение, то есть: «закрытьЗапрограммируйте, если сообщение 'click' описывает управление кнопкой выхода. Ничего не предпринимайте, если сообщение 'click' описывает родительское окно. ".
Чтобы узнать больше о Windows, посмотрите здесь: http://msdn.microsoft.com/en-us/library/aa383738%28v=vs.85%29.aspx
Подклассы - это процесс перехвата и / или перехвата сообщений, предназначенных для другой процедуры Window.Обычно он служит способом расширения поведения элементов управления и окон сторонних приложений.Можно создать подкласс другого процесса, используя DLL , GetWindowLong()
, SetWindowLong()
, CallWindowProcedure()
и собственную пользовательскую оконную процедуру.Это довольно просто - вот как вы это сделаете:
- Найдите целевое окно, которое вы хотите создать подклассом, используя
FindWindow()
- Получите предыдущую оконную процедуру и сохраните ее.
WNDPROC wpOrigEditProc = GetWindowLong(hTargetWnd, GWL_WNDPROC)
- Замените процедуру окна своей собственной.
SetWindowLong(hTargetWnd, GWL_WNDPROC, HookWndProcedure);
Затем,когда выгрузите, восстановите старую оконную процедуру снова.Процедура Window - это то, где произойдет вся ваша магия.Внутри этой функции вы сможете решить, какие сообщения вы хотите обработать и какие сообщения вы хотите передать в старую оконную процедуру.Вот пример оконной процедуры:
LRESULT APIENTRY HookWndProcedure(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
if(hwnd == hTargetWndButton_OK) {
// This is the button we wish to intercept... do some processing, then send it back to Windows
return DefWindowProc(hwnd, uMsg, wParam, lParam);
} else {
// Allow the message to pass through to the original application's window procedure.
return CallWindowProc(wpOrigEditProc, hwnd, uMsg,
wParam, lParam);
}
}
`
Хитрость заключается в загрузке вашей DLL в целевой процесс.Я полагаю, что лучший способ сделать это - добавить в приложение запись импорта, которая указывает на вашу DLL, так как приложение и ваша DLL должны все равно оставаться вместе.Чтобы добавить импорт, используйте CFF Explorer!
Уверен, у вас возникнут дополнительные вопросы, потому что может отсутствовать некоторая информация.Я постараюсь ответить на любые другие вопросы, которые возникают из моего поста, но если я не отвечу сразу, прочитайте ссылку MSDN выше: D.Надеюсь, это станет отличным опытом для вас:)