Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.23;
Скачать: CL | DM;

Вниз

хук в dll   Найти похожие ветки 

 
максим   (2008-02-22 01:15) [0]

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


 
Германн ©   (2008-02-22 01:18) [1]


> хук в dll
>
> максим   (22.02.08 01:15)
>
> как мне в dll обработать нажатие скажем ctrl+left_mouse_button
> ?
>

Дожили, блин. Сначала появилась привычка "запихивать формы" в dll, теперь нужен в dll ещё и хук.
Куда катится этот мир?
:)


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

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


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


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

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


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

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


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


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

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


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

делаю так:
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 02:18) [7]

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


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


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

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


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

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


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


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

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


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

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


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


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

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


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

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


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


> максим


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


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

> Германн

Нет слов.

> максим   (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;


 
Washington ©   (2008-02-22 12:10) [16]

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


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


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


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


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

спасибо,делаю так:
 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 13:29) [19]


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


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

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

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


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

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


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

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

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



Страницы: 1 вся ветка

Текущий архив: 2008.03.23;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.018 c
2-1204059135
Strate
2008-02-26 23:52
2008.03.23
Скорость работы.


2-1204014098
dracula
2008-02-26 11:21
2008.03.23
ReadFile и юникод


2-1204021904
Miraj
2008-02-26 13:31
2008.03.23
Передача файла через интернет


4-1185433986
Dmitry_177
2007-07-26 11:13
2008.03.23
Можно ли какнибудь определить время и период срабатывания таймера


11-1186128845
Александр_2006
2007-08-03 12:14
2008.03.23
Разархивирование из ZIP