как работает WatchHotKey: ?

Обсуждение программ nnCron и nnCron LITE

как работает WatchHotKey: ?

Postby d00h » Thu, 24 Mar 2005, 13:12

не очень понятно как работает subj
попытался настроить на не используемые у меня клавиши:
    1.переключение раскладки клавиатуры CapsLock
    используется две раскладки русская/english
    Code: Select all
       NoLog
       WatchHotKey: "{CAPSLOCK}"
       WINAPI: GetForegroundWindow USER32.DLL
       WINAPI: PostMessageA USER32.DLL

       1   CONSTANT HKL_NEXT
       80  CONSTANT WM_INPUTLANGCHANGEREQUEST
       Action:
          HKL_NEXT 0 WM_INPUTLANGCHANGEREQUEST       GetForegroundWindow PostMessageA
         DROP

    2.Включение интернета на Numlock
    Code: Select all
       NoLog
       WatchHotKey: "{NUMLOCK}"
       Action:
       ONLINE? IF
                         HANGUP
                    ELSE
                       RASUser:
                        ...
                        ...
                    TNEN

    Хотелось бы в идеале чтоб в одном состоянии лампочка горела в другом - нет.
    В принципе и если она всегда погашена то же не плохо.

    но nncron ведет себя третим способом :)
    событие происходит и плюс к тому происходит переключение capslock
    или numlock соответственно. Как с этим бороться?

p.s.:
дополнительной клавиатурой я всегда прользуюсь для перемещения
а набираю текст всегда
в нижнем регистре(если требуется с шифтом)
d00h
 
Posts: 20
Joined: Tue, 07 Dec 2004, 17:46

Сразу еще вопросы в ту же тему

Postby d00h » Thu, 24 Mar 2005, 14:30

1. хочу чтоб scrolllock мигал при получении сообщения(письма) а при нажатии
открывал соответствующее сообщение

как отсечь событие знаю,
как зажигать лампочу ну то же (программным нажатием)

вопрос как отличить программное нажатие scrolllock и фактическое?

2. Можно ли в nncron отсечь какие клавиши управления
нажимаются (left,right etc) на keypad или просто стрелки? (vk у них одинаковые)
d00h
 
Posts: 20
Joined: Tue, 07 Dec 2004, 17:46

Postby Nicholas_Nemtsev » Thu, 24 Mar 2005, 16:19

Надо компенсировать нажатия:
Code: Select all
#( test-capslock
WINAPI: GetKeyState USER32.DLL
WatchHotKey: "{CAPSLOCK}"
VARIABLE CAPSLOCK-FLAG
Rule: CAPSLOCK-FLAG @ 0= ;
Action:
CAPSLOCK-FLAG ON
SEND-KEYS: {CAPSLOCK}
10 PAUSE
0x14 GetKeyState 1 AND 0<> IF SEND-KEYS: {CAPSLOCK} THEN
10 PAUSE
CAPSLOCK-FLAG OFF
...
)#

Для NUMLOCK надо заменить 0x14 на 0x90
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Не работает :(

Postby d00h » Thu, 24 Mar 2005, 23:59

То же самое поведение что описывалось ранее НЕ РАБОТАЕТ :((
все равно переключает большие буквы маленьние
nncron 1.91b5

Code: Select all
#( keys:change_language
NoLog
WINAPI: GetKeyState USER32.DLL
WINAPI: GetForegroundWindow USER32.DLL
WINAPI: PostMessageA USER32.DLL
1 CONSTANT HKL_NEXT
80 CONSTANT WM_INPUTLANGCHANGEREQUEST
: KBD-INPUT-NEXT
    HKL_NEXT 0 WM_INPUTLANGCHANGEREQUEST GetForegroundWindow PostMessageA
    DROP
;

WatchHotKey: "{CAPSLOCK}"
VARIABLE CAPSLOCK-FLAG
Rule: CAPSLOCK-FLAG @ 0= ;   \ на столько я понимаю блокировка
Action:
CAPSLOCK-FLAG ON                \ устанавливаем флаг блокировки
SEND-KEYS: {CAPSLOCK}       \ посылаем компенсирующий capslock
10 PAUSE
\ НО если он нажат посылаем его ещё раз?
0x14 GetKeyState 1 AND 0<> IF SEND-KEYS: {CAPSLOCK} THEN

10 PAUSE
KBD-INPUT-NEXT
CAPSLOCK-FLAG OFF                \ сбрасываем  флаг блокировки
)#


так всё же пропускает WatchHotKey: клавишу дальше
почему WatchHotKey: "q" никуда не уходит?
d00h
 
Posts: 20
Joined: Tue, 07 Dec 2004, 17:46

Re: Не работает :(

Postby Nicholas_Nemtsev » Fri, 25 Mar 2005, 10:20

d00h wrote:так всё же пропускает WatchHotKey: клавишу дальше
почему WatchHotKey: "q" никуда не уходит?

CAPSLOCK уходит потому, что имеет специальное значение в системе.
У меня этот скрипт нормально работает (лампа не зажигается, вернее, моргает). И, кстати, нормально переключает рус/анл даже в консольных программа.
Windows 2003.
Это лишнее (уже есть в кроне):
WINAPI: GetForegroundWindow USER32.DLL
WINAPI: PostMessageA USER32.DLL
Nicholas Nemtsev
User avatar
Nicholas_Nemtsev
Site Admin
 
Posts: 857
Joined: Thu, 01 Jul 2004, 22:25
Location: Псков

Postby d00h » Sat, 26 Mar 2005, 11:21

Интерестно что под WinXpSp1 все работает
только ели попробовать забить клавиатуый буффер например зажав клавишу глючит.
А под sp2 вообще не работет.

при коде подобном этому ничего никогда не мограем
извиняюсь что на С (кажеться это не приветствуется)
Code: Select all
LRESULT CALLBACK KbdHook(int nCode,WPARAM wParam,LPARAM lParam) {
  if (nCode<0)
    return CallNextHookEx(g_khook,nCode,wParam,lParam);
  if (nCode==HC_ACTION) {
    KBDLLHOOKSTRUCT   *ks=(KBDLLHOOKSTRUCT*)lParam;
    if (ks->vkCode==g_key) {
      if (wParam==WM_KEYDOWN) {
   HWND hWnd=GetForegroundWindow();
   if (hWnd)
     PostMessage(hWnd,WM_INPUTLANGCHANGEREQUEST,0,(LPARAM)HKL_NEXT);
      }
      return 1;
    }
  }
GetModuleHandle(0),0);
skip:
  return CallNextHookEx(g_khook,nCode,wParam,lParam);
}
...
....   g_khook=SetWindowsHookEx(WH_KEYBOARD_LL,KbdHook,GetModuleHandle(0),0);


вопрос возможно ли как-то отличать nncron клавиши c
VK=0xFF нестандартые multimedia : (cуществует ли какой нибудь доступ к lParam)

Большое спасибо за nncron.[/code]
d00h
 
Posts: 20
Joined: Tue, 07 Dec 2004, 17:46

Консоль для отладки стриптов?

Postby d00h » Tue, 29 Mar 2005, 16:54

Предположив что lparam WatchHotKey
остается где-то в стеке в момент выполнения Action:
тем более глубина стека на момент старта Action: 101

попробовал посмотреть что в лежит в стеке
Code: Select all
#( test3
WatchHotKey: "{0xFF}"
: .seporator (  -- )   ." -------------------------------" CR ;
: .X ( n -- )  0xF BASE !  .   0xA BASE ! ;
: .stack ( n -- )
  .seporator
  0 DO
    ." +" I . ." == " I PICK .X CR
    LOOP
  .seporator CR
;
Action:
 CONSOLE
 10 .stack
)#

результат меня очень удивил
во первых получил кучу отрицательных шеснадцатеричных чисел
во вторых предложенно для закрытия консоли набрать BYE
а клавиатурнай фокус на окно никак не попадает :(
в третих с некоторой вероятностью крон уходил в даун
сервис останавливался

все-таки как использовать нормально консоль для вывода промежуточных данных
можно ли просто загрузить свои скрипты в консоль (тем более существует удаленная консоль)
использование слова -runfile <filename> открывает файл а после выполнения выдает эксепшен
d00h
 
Posts: 20
Joined: Tue, 07 Dec 2004, 17:46

Postby NoN » Sat, 23 Jul 2005, 14:35

lParam 64битный!
NoN
 

Postby d00h » Mon, 22 Aug 2005, 17:15

с чего это вдруг?
sizeof(LPARAM)=4

вообще в стеке LPARAM нет
легко убедиться запустив тестовою задачу
Code: Select all
#( keys2:test
  WatchHotKey: "{F1}"   \ scancode 0x3b
  WatchHotKey: "{F2}"   \ scancode 0x3c
  WatchHotKey: "{F3}"   \ scancode 0x3d
  Action:
  SP@ DEPTH DUMP CR
)#
d00h
 
Posts: 20
Joined: Tue, 07 Dec 2004, 17:46

Postby NoN » Wed, 24 Aug 2005, 21:47

Я смотрел размер lParam в MS SDK.
NoN
 


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests

cron