26

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

YMP пишет:

Для GetModuleHandle тоже надо Fast указать.

Не совсем понял, как это?
Может, нужно учесть наличие Unicode и ANSI версий GetModuleHandle()? creature.ws, попробуй в последнем моём варианте заменить GetModuleHandle на GetModuleHandleW.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

27

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

creature.ws пишет:

При DllCall("GetModuleHandle", UInt, 0, "Fast") клавиатурный хук работает так же как и на ahk_l x86; winxp.
Хук мыши же приводит к неподвижности курсора при первом клике.

А у меня не приводит. Хотя вообще движется курсор как слегка больной. Я бы так работать не хотел, конечно.
Win7/64 HE SP1, AHK_64 1.1.05.04

28

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Да откуда ты этот Fast в DllCall() взял?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

29

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

teadrinker
Я что-то сам не пойму. Я подумал, что Fast — это соглашение вызова на 64 битах (fastcall). Но судя по описанию RegisterCallback, это не то. Да и по идее AHK_64 по умолчанию должен fastcall использовать. К сожалению, я с ним дела практически не имел, использую AHK_L 32 Unicode.

30

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Чудеса: я сейчас вместо "Fast" поставил чисто от балды "Abc" — тоже помогает!

31

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Может, за "Cdecl" принимает? (Правда, я не очень понимаю, что это такое).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

32

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Понял, что тут работает: при всех этих левых добавках GetModuleHandle возвращает пустое значение. Можно вместо него просто передать 0.

Кстати, вроде там и нужен ноль по идее.

SetWindowsHookEx Function пишет:

hMod
[in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.

dwThreadId
[in] Specifies the identifier of the thread with which the hook procedure is to be associated. If this parameter is zero, the hook procedure is associated with all existing threads running in the same desktop as the calling thread.

Может, логика такая, что all existing threads running in the same desktop as the calling thread включают и саму calling thread, т.е. ты как бы её указал. К тому же the hook procedure ведь не в DLL.

teadrinker

Может, за "Cdecl" принимает? (Правда, я не очень понимаю, что это такое).

Cdecl отличается от stdcall только тем, что вызванная функция при выходе не меняет указатель стека так, чтобы переданные ей параметры оказались в свободной части стека. За неё это должен сделать вызывающий код. В Windows API cdecl практически нет. Только функцию wsprintf знаю. Ну и функции в msvcrt.dll, но это ведь не часть API, а "C runtime".

33

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Во всяком случае, у меня на XP c нулём вместо GetModuleHandle не прокатывает ни тот, ни другой хук.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

34

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

При DllCall("GetModuleHandleW", UInt, 0) не работает.
При передаче нуля - tooltip показывается, 1-2 клика обрабатываются - курсор останавливается.
После закрытия скрипта курсор рывком перемещается в точку куда был бы переведен, не будь он обездвижен

35

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

teadrinker
Да, на ХР не работает с нулём. Остаётся, видимо, проверять версию АНК и использовать либо hModule, либо нуль.

creature.ws
У Вас винда кривая. Наверно, не все 64 бита положили, пересчитайте.
Возможно, ещё какой-то скрипт работает и мешается под ногами?

36 (изменено: creature.ws, 2011-12-30 00:19:22)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Видимо так
Проверил после перезагрузки при отключенном основном скрипте, более в системе посторонних хуков мыши никто ставить вроде бы не должен.

Service Pack 1 Build 7601, x64-based,  68 Hotfix(s) Installed; Ahk_L U x64 1.1.05.05

37

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

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

Сохранение буфера обмена, выполнаю с помощью подпрограмы OnClipboardChange, удобно вести историю копируемого, но вот хотелось бы сохранять у себя на компьютере, еще и все, что набирается на клавиатуре, а стороннее ПО использовать для этого не охота.

http://alucky.globus-inter.com

38

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Вот, а также была соответствующая тема в разработке, ищи, там подробнее.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

39 (изменено: BalRoG, 2012-03-09 16:31:59)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Огромное вам спасибо всем за скрипты!!!
На Windows 7 x64 Autohotkey_L 1.1.07.01 работает

40

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Жаль, на AHK_L x64 мышиный хук приводит к обездвиживанию курсора при первом-втором клике.

41

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Посмотри, может там где-то "UInt" нужно заменить на "UPtr".

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

42 (изменено: creature.ws, 2012-03-09 19:56:19)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Спасибо за рекомендацию, попробовав вариант с заменой UInt на Ptr во всех подходящих местах и не получив желаемого результата, решил таки проверить скрипт на свежеустановленной на вм аналогичной системе. Работает в оригинальном виде при hMod = 0
Вероятно, подтвердилось сказанное выше:

creature.ws
У Вас винда кривая.

Мои извинения за ложные багрепорты

43

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Есть одно замечание по скрипту. Насколько мне известно, в функциях низкоуровневого хука следует проверять значение аргумента nCode, если nCode < 0, процедура должна немедленно вызвать CallNextHookEx и вернуть значениe этой функции, обработка же хука осуществляется только при nCode >= 0.

44 (изменено: kirtech, 2012-03-10 01:49:54)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

afinagen да, именно так и об этом пишут на MSDN:

LowLevelMouseProc

LowLevelKeyboardProc

мой пример перехвата нажатий клавиш на Purebasic

45 (изменено: BalRoG, 2012-05-11 17:52:22)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Может кому пригодится у кого сложности как у меня со скриптингом - функция для автохоткея чтобы выводить полученные сканкоды и виртуалкеи в формате в котором работает сам автохоткей
необходимые параметры - сам код, далее extended информация (0 или 1 - добавляется 3ий разряд к сканкоду) и сам мод - SC или VK

KeyCodeGetHex(number,extend,mode) {
    arrMods:=["16","1"]
    if (mode="sc") {
        SetFormat, Integer, D
        result:=extend+0
        SetFormat, Integer, H
    }
    Loop, 2
    {
        tmp:=Mod(number//arrMods[A_Index],16)
        StringTrimLeft, tmp, tmp, 2
        result.=tmp
    }
    Return mode . result
}

46

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

afinagen пишет:

Есть одно замечание по скрипту. Насколько мне известно, в функциях низкоуровневого хука следует проверять значение аргумента nCode, если nCode < 0, процедура должна немедленно вызвать CallNextHookEx и вернуть значениe этой функции, обработка же хука осуществляется только при nCode >= 0.

В моём примере CallNextHookEx возвращается в любом случае. Что же до ситуации, когда nCode < 0, то вот такой скрипт

   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
      , Int, WH_MOUSE_LL := 14
      , Int, RegisterCallback("LowLevelMouseProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return
 
Exit:
   DllCall("UnhookWindowsHookEx", Uint, hHookKeybd)
   ExitApp
 
LowLevelMouseProc(nCode, wParam, lParam)
{
   ToolTip % nCode
   if nCode < 0
      SoundBeep
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}
 
Esc::ExitApp

показывает, что подобного в данном варианте установки хука просто не происходит.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

47 (изменено: BalRoG, 2012-05-11 17:53:33)

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Прошу подскажите, пожалуйста, как сделать, чтобы эти низкоуровненые хуки не ловили то, что шлет Autohotkey?

48

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

Ты имеешь в виду нажатия клавиш, или что?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

49

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

допустим мы сделали Hotkey в скрипте - на F1 у нас вместо F1 жмется F2, тогда хуки это увидят так: F1 Down F2 Down F2 Up F1 Up, то есть хуки видят не только физические нажатия пользователя по клаве, но и виртуальные нажатия посылаемые автохоткеем, вот подскажите очень очень прошу, как сделать чтобы эти виртуальные нажатия не хукались?

50

Re: AHK: Как перехватить все перемещения мыши и все нажатия клавиш?

if(NumGet(lParam|0, 8, "uint")&16)
   ...