Что нового

[Мышь, клавиатура] вопрос по хоткеям функциия HotKeySet

weweWe45s

Новичок
Сообщения
36
Репутация
1
эээ ... функция HotKeySet при использовании в скрипте как я понимаю вешается прослушку всех событий клавиатуры в системе
и она перекрывает доступ другим приложениям к клавиатурным сочетаниям указным в этой функции и заворачивает их в скрипт

вапрос можно как ни буть организовать что то на вроде хот кей меню?

на вроде этого:
1). при нажатии сочетания клавиш к примеру ALT+SHFT+Q входим в режим прослушки событий клавиатуры HotKeySet
CTRL+Q, CTRL+Q итд. становятся событиями скрипта

2.) при нажатии сочетания клавиш к примеру ALT+CTRL+Q выходим из режим прослушки событий клавиатуры HotKeySet
CTRL+Q, CTRL+Q итд. становятся событиями системы и других приложений
 
Автор
W

weweWe45s

Новичок
Сообщения
36
Репутация
1
попробовал обойти. не то. так нажатые клавиши запоминаются.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$hWndb=GUICreate("num", 100, 200, -1, -1)
GUISetState()
Const $key1 = 0x39
Const $key2 = 0x44

While 1
	Dim $out = 0, $aRet[1], $bRet[1]
	$aRet[0] = 0
	$bRet[0] = 0
	$aRet = DllCall("user32.dll", "int", "GetKeyState", "int", $key1)
	$bRet = DllCall("user32.dll", "int", "GetKeyState", "int", $key2)
	If $aRet[0] Then 
		$out = $out + 1
	EndIf	
	If $bRet[0] Then 
		$out = $out + 1
	EndIf	
	If $out == 2 Then 
		ExitLoop
	EndIf
WEnd
	
Exit


зы капча ад какой то
 
A

Alofa

Гость
Код:
; А где?
HotKeySet()
; или
_IsPressed()
; или
_WinAPI_GetAsyncKeyState() ; к примеру...
; и т.п.



Добавлено:
Сообщение автоматически объединено:
OffTopic:

weweWe45s сказал(а):
зы капча ад какой то
На то и расчет. Защита от "умолишенных".
 
Автор
W

weweWe45s

Новичок
Сообщения
36
Репутация
1
уточнение к перед идущему сообщению собственно shift+cnrl+alt+enter активирует "хоткей меню" d или 9 меняют размер окна
shift+cnrl+alt+esc закрывает

[hide]
Код:
#include <GUIConstantsEx.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;пояснение к предидущему сообщению

$hWndb=GUICreate("press Ctrl+Shift+Alt+ENTER, d or 9", 400, 200, 100, 100)
GUISetState()

$key1 = 0x39 ;key "9"
$key2 = 0x44 ;key "d"

$menu_state = 0

HotKeySet("^!+{ENTER}", "menu_key1");активация эээ... хоткей меню
func menu_key1()
    if $menu_state == 0 then $menu_state = 1
endfunc

HotKeySet("^!+{ESCAPE}", "menu_key2");закрытие хоткей меню
func menu_key2()
    if $menu_state <> 0 then $menu_state = 0
endfunc

While 1
    Dim $aRet[1], $bRet[1]
    $aRet[0] = 0
    $bRet[0] = 0
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE
			exitloop    
        Case Else
            if $menu_state == 1 then 
               $aRet = DllCall("user32.dll", "int", "GetKeyState", "int", $key1)
               $bRet = DllCall("user32.dll", "int", "GetKeyState", "int", $key2)
               if $aRet[0] then WinMove($hWndb, "", 100, 100, 200, 100)
               Dim $aRet[1];предполагается что сбрасывает состояние клавиш
               if $bRet[0] then WinMove($hWndb, "", 100, 100, 400, 200)
               Dim $bRet[1] ;предполагается что сбрасывает состояние клавиш
               GUISetState()
             endif
    EndSwitch
WEnd
	
Exit

[/hide]

чем не устраивает. тем что состояние клавиш "d" и "9" не сбрасывает отсюда изрядная глюковатость



Добавлено:
Сообщение автоматически объединено:

и да спасибо Alofa за наводку надо глянуть будет


Добавлено:
Сообщение автоматически объединено:

решено еще бы в режиме "хоткей меню" сообщения от горячих клавиш передавать только в скрипт

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

;решено: пример

$hWnd=GUICreate("press Ctrl+Shift+Alt+ENTER, d or 9", 400, 200, 100, 100)
GUISetState()

$key1 = 0x39 ;key "9"
$key2 = 0x44 ;key "d"
$menu_state = 0

HotKeySet("^!+{ENTER}", "menu_key1");вход в хоткей меню слушаем клавиши "d" и "9"
func menu_key1()
    if $menu_state == 0 then $menu_state = 1
endfunc

HotKeySet("^!+{ESCAPE}", "menu_key2");выход из хоткей меню
func menu_key2()
    if $menu_state <> 0 then $menu_state = 0
endfunc

func press_key1()
    WinMove($hWnd, "", 100, 100, 200, 100)
    GUISetState()
endfunc

func press_key2()
    WinMove($hWnd, "", 100, 100, 400, 200)
    GUISetState()
endfunc

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
		Case $GUI_EVENT_CLOSE
			exitloop    
        Case Else
            if $menu_state == 1 then 
                $aRet = _WinAPI_GetAsyncKeyState($key1)
                $bRet = _WinAPI_GetAsyncKeyState($key2)
                if $aRet <> 0 then 
                    press_key1()
                endif
                if $bRet <> 0  then    
                    press_key2()
                endif
            endif
    EndSwitch
WEnd
	
Exit




Добавлено:
Сообщение автоматически объединено:

поспешил еще не решено


Добавлено:
Сообщение автоматически объединено:

решено все оказалось проще GUISetAccelerators
 
Верх