Форум: "Начинающим";
Текущий архив: 2008.03.23;
Скачать: [xml.tar.bz2];
Внизхук в 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.005 c