![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хук (или ещё что), не использубю DLL. [D5, Win95/98]
Serd_hhc © (2002-03-17 10:44:00)Уважаемые Мастера,
Во-первых спасибо MBo, alexproger, VuDZ за помощь в предыдущем моём вопросе.
Во-вторых, я бы хотел узнать, как не используя DLL поставить хук (или ещё что-нибудь) на Появление окна, и если это нужное окно (например "Установка связи с *******"), то ловить нажатые клавиши.
Пожалуйста, дайте код, не использующий всякие там Forms... :)
Заранее спасибо тем, кто ответит на сабж.
VuDZ (2002-03-19 11:45:00) [1]а я и предложил без хука - всё работает отлично (почти :> )
Fellomena (2002-03-19 10:50:00) [2]KeySpy пишем ? - похвально, похвально ;)
Повторюсь ещё раз - глобальные хуки можно размещать тольков dll.
Можно и в Win32 обойтись без хуков для считывания нажатых клавишь, но это будет не самый элегантный вариант решения такого рода задачи :)
VuDZ (2002-03-17 12:08:00) [3]ну да...
// Key Attacher.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include
#include
char GetPressedKey(BYTE* bt){
for (int i = 31; i < 256; ++i)
if ((bt[i] >> 7)== 1)
return i;
return 0;
}
int main(int argc, char* argv[])
{
HWND hNote = FindWindow("Notepad", NULL);
DWORD thID = GetWindowThreadProcessId(hNote, NULL);
BOOL bAttach = AttachThreadInput(GetCurrentThreadId(), thID, TRUE);
DWORD dwErr = GetLastError();
BYTE *state = new BYTE[256];
char keys[2] = {0, 0};
do{
GetKeyboardState(state);
keys[0] = GetPressedKey(state);
if (keys[0] != 0)
printf((const char*)&keys);
Sleep(100);
} while (keys[0] != "z");
return 0;
}
в конслоле будут все нажатые клавиши, в том числе Ctrl, Alt, Del - т.е. записываться скан коды всех клавиш
способ не иделальнй - но, главное - это намёк :>
Serd_hhc (2002-03-17 11:10:00) [4]Я видел как на Си++ без хуков обходяться, там что-то вроде проверка клавы на нажатые клавиши (Жаль текста нет). Но как на Делфи такое делать незнаю....
Ну а если даже так, где можно посмотреть примеры хуков на создание окна (на нажатие клавиш я видел).
VuDZ (2002-03-17 10:50:00) [5]ты не сможешь этого сделать. Код обязатель должен быть в DLL, т.к. только Dll может грузиться в адресное пространство другого процеса.
это связано с тем. что в защищёном резиме под win32 у каждого процеса свои адреса. т.е. если у тебя есть указтель
p = 0x1234567;
то в одном приложение он будет указывать на одни данные, а в другом - на другие. Почти то же самое и с dll и хуками.
Так что пиши dll - это очень просто.