Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > вопрос по SetWindowHookEx()


Автор: yngwie19 13.4.2009, 16:56
Всем привет. Хочу поставить hook на клавиатуру, хочу заблокировать нажатие всех клавиш, делаю так:
Код


HWND hwnd;

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 
      SendMessage(hwnd,WM_KEYDOWN,0,0);
      SendMessage(hwnd,WM_KEYUP,0,0);
      return 0;
  
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR,int)
{
    WNDCLASS wc;
    MSG msg;
................................
.................................
hwnd = CreateWindow(......)
..........................
while(GetMessage(&msg,0,0,0);
{
    DispatchMessage(&msg);
}

    SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInst,0);
    return 0;

}

все равно клавиши не блокируются. Что Я делаю не так?

Автор: GremlinProg 13.4.2009, 17:53
Цитата(yngwie19 @  13.4.2009,  18:56 Найти цитируемый пост)
Что Я делаю не так?

хук ставишь после отработки программы

Автор: yngwie19 13.4.2009, 18:05
GremlinProg, Я его ставлю в функции WM_CREATE, нужно до GetMessage() ?

Автор: GremlinProg 13.4.2009, 19:41
Цитата(yngwie19 @  13.4.2009,  20:05 Найти цитируемый пост)
Я его ставлю в функции WM_CREATE, нужно до GetMessage() ?

в какой WM_CREATE, у тебя же ясно написано:
Цитата(yngwie19 @  13.4.2009,  18:56 Найти цитируемый пост)

while(GetMessage(&msg,0,0,0);
{
    DispatchMessage(&msg);
}
    SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInst,0);
    return 0;

после отработки программы
какого эффекта ты тут от него ждешь?

нужно его расположить хотя бы до исполнения цикла 

Автор: yngwie19 13.4.2009, 19:45
GremlinProg, у меня в коде он запускается в WM_CREATE здесь Я написал маленький пример, чтобы проще было объяснить. Я его поставил перед DispatchMessage(), все равно клавиши не блокируются. 
Цитата(yngwie19 @  13.4.2009,  16:56 Найти цитируемый пост)
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 
      SendMessage(hwnd,WM_KEYDOWN,0,0);
      SendMessage(hwnd,WM_KEYUP,0,0);
      return 0;
  
}


Подскажи что Я делаю не так? что мне сделать чтобы нажатие клавиш игнорилось?

Автор: GremlinProg 13.4.2009, 20:11
а какой смысл приводить вдвойне ошибочный пример на свой нерабочий код?
приводи актуальный код

мне, к примеру, такие и перехват и главный цикл окна - весьма сомнительны
без TranslateMessage - у тебя и так WM_CHAR приходить не будет

поставь _RPT0("хук!!!\r\n") в процедуре перехвата
ну и позажимай кнопки backspace, enter, ctrl и т.п.
смотри в окно Output
если в нем нет "хук!!!", значит разбирай примеры из MSDN
http://www.google.com/search?client=opera&rls=ru&q=Using+Hooks&sourceid=opera&ie=utf-8&oe=utf-8
и в поиск по форуму

Автор: yngwie19 13.4.2009, 23:01
Я вот что подумал, а нельзя ли как-нибудь следить за буфером и как только что-то туда попадает сразу же очищать. Тогда и вставлять нечего. Подкиньке пожалуйста примерчик на эту темку

Автор: yngwie19 13.4.2009, 23:18
вот вроде нашел:
Код

if (OpenClipboard(hMainWnd))
       EmptyClipboard();


вроде ничего не копируется.
1)  Скажите эти функции нужно один раз где-нибудь написать а они постоянно будут следить за буфером и если тат что-то появится, то оно сразу уничтожится? Или надо самому следить скажем через WM_TIMER через определенное время их вызывать и проверять?
2) Скажите этих функций вроде достаточно для защиты от копирования текста, даже PrintScreen не берет, можно хуки не вешать? Или еще как-нибудь можно скопировать текст (в моем случае из RichEdit) ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)