![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
хук в dll
максим © (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]никаких форм в длл)))