Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

хук в dll


Страницы:   1 2

максим ©   (2008-02-22 01:15:00) 

как мне в dll обработать нажатие скажем ctrl+left_mouse_button ?


Сергей М.   (2008-02-22 13:44:00) [1]

Какой еще "машинный" ?)

М ышиный, а не м ашин ный)


максим   (2008-02-22 13:41:00) [2]

чет я ваще запутался, что есть "машинный хук"? приведите пример пожалуйста


Сергей М.   (2008-02-22 13:29:00) [3]


> максим   (22.02.08 13:20) [18]


Ты вообще не тот хук ставишь.

Тебе нужен мышиный хук, а не клавиатурный.

В мышиной хук-функции проверяешь, была ли нажата ее левая кнопка и нажата ли при этом клавиша-модификатор CTRL


максим   (2008-02-22 13:20:00) [4]

спасибо,делаю так:
 If ((GetKeyState(VK_CONTROL) AND 128)=128) and
    ((GetKeyState(VK_LBUTTON) AND 128)=128) and (not flag)
 then
begin
  Flag := True;
  Form1.Memo1.Lines.Add('fds');
end
else
 If ((GetKeyState(VK_CONTROL) AND 0)=0) and
    (GetKeyState(VK_LBUTTON) =0)  then
    Flag := false;

но в мемо добавляется только после второго нажатия моус1


Сергей М.   (2008-02-22 12:16:00) [5]


> для WM_MOUSE нужна DLL?


Если требуется перехват этого сообщения во всехGUI-процессах - да, нужна.


Washington   (2008-02-22 12:10:00) [6]

А для WM_MOUSE нужна DLL?


Семеныч   (2008-02-22 09:06:00) [7]

> Германн

Нет слов.

> максим   (22.02.08 01:15)

Ваш хук действительно не нуждается ни в каких DLL. И он прекрасно работает - точно так, как написан. Но написан он неправильно.

Когда клавиша держится зажатой, клавиатура генерит ее автоповтор - как будто она часто-часто нажимается. Вот этот автоповтор Ваш хук и отлавливает, надо полагать. И на каждом отлове честно делает свое дело.

Значит, в хук нужно ввести логический флажок, а проверять надо еще и отпускание клавиш. Примерно по такой схеме:

var
 Flag: boolean = False; // глобальная переменная

 if (not Flag) and (клавиши_нажаты) then
 begin
   Flag := True;  
   Form1.Memo1.Lines.Add('fds');
 end
 else
   if (клавиши_отпущены) then
     Flag := False;


Сергей М.   (2008-02-22 08:15:00) [8]


> максим


Хук типа WH_KEYBOARD_LL не нуждается ни в каких dll


максим   (2008-02-22 03:03:00) [9]

самое интересное, что я сам щас прочитал и не понял самого себя...
мда..., сорри...уже совсем плохо стал сображать надо ко сну уже отходить.
А имел я ввиду следующее: получается когда зажимаю нужную мне пару клавиш, то условие в моем случае это  form1.Memo1.Lines.Add('fds'); выполняется до тех пора пока я не отпущу клавишы. а мне нужно чтобы я нажал и один раз добавилось form1.Memo1.Lines.Add('fds');


Германн   (2008-02-22 02:57:00) [10]


> максим   (22.02.08 02:49) [11]
>
> подскажите как сделать чтобы одно нажатие означало выполнение
> один раз условия, а не все всеряпока зажаты нужные мне
> клавишы?
> буду очень благодарен

Сначала переведи на русский термин "всеря"!


максим   (2008-02-22 02:49:00) [11]

подскажите как сделать чтобы одно нажатие означало выполнение один раз условия, а не все всеря пока зажаты нужные мне клавишы?
буду очень благодарен


Германн   (2008-02-22 02:27:00) [12]


> максим   (22.02.08 02:25) [9]
>
> вроде воткнул :)
>

Это уже попахивает пошлятиной.


максим   (2008-02-22 02:25:00) [13]

вроде воткнул :)


Германн   (2008-02-22 02:25:00) [14]


> максим   (22.02.08 02:16) [6]
>
> делаю так:
>

И кто тебя этому учил?


максим   (2008-02-22 02:18:00) [15]

точне если зажать на ctrl и моус1 то текст будет постоянно добавляться что мне не нужно :(


максим   (2008-02-22 02:16:00) [16]

делаю так:
procedure TForm1.FormCreate(Sender: TObject);
const
 WH_KEYBOARD_LL = 13;
begin
 hHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
 if hHook = 0 then RaiseLastOSError;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if not UnhookWindowsHookEx(hHook) then RaiseLastOSError;
end;

function LowLevelKeyboardProc(nCode: Integer;
 WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
begin
 if nCode = HC_ACTION then
   Result := CallNextHookEx(hHook, nCode, WParam, LParam);

  If ((GetKeyState(VK_CONTROL) AND 128)=128) and
     ((GetKeyState(VK_LBUTTON)      AND 128)=128)
  then
 form1.Memo1.Lines.Add('fds');
end;

работае но как то неправильно, добавляется в мемо не с первого раза, и добвляется сразу 2-3 записи, можно подумать будто за раз обрабатывает это сообщение 3 события...


Германн   (2008-02-22 01:56:00) [17]


> максим   (22.02.08 01:46) [4]
>
> ну надо мне чтобы длл загрузилась и висела на фоне, и хук
> делал на некторое нажатия клавиш...че здесь плохого то?:
> )
>

А что такое есть хук?
Плохого тут пока ничего нет. Но вопрос не понятен.
"> ну надо мне чтобы длл загрузилась и висела на фоне"
Это как?
В очередной раз "слышал звон"... :)
Прочитай http://delphimaster.ru/articles/hooks/index.html
Может поможет.


максим   (2008-02-22 01:46:00) [18]

ну надо мне чтобы длл загрузилась и висела на фоне, и хук делал на некторое нажатия клавиш...че здесь плохого то?:)


Германн   (2008-02-22 01:36:00) [19]


> максим   (22.02.08 01:21) [2]
>
> никаких форм в длл)))
>

Но если нет никаких форм, то какое, блин, "нажатие скажем ctrl+left_mouse_button"? Классическая dll включает в себя и экспортирует для других некие функции/процедуры.
Что ты имеешь в виду, Саид?


максим   (2008-02-22 01:21:00) [20]

никаких форм в длл)))


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо