Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1204030372
vegarulez
2008-02-26 15:52
2008.03.23
Вопрос про создание TLabel.


2-1203588470
oleg_teacher
2008-02-21 13:07
2008.03.23
Свое расширение на файл.


15-1202600368
NeyroSpace
2008-02-10 02:39
2008.03.23
QUIK


15-1202597190
Андрей
2008-02-10 01:46
2008.03.23
разбирайте кто хочет


2-1203507590
серж
2008-02-20 14:39
2008.03.23
ооп вопрос





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский