- Offizieller Beitrag
EDIT 2020-04-15
Fast vergessen: Natürlich muss man auch ein bestehendes Control für einen Accelerator verwenden können, nicht nur Dummies.
EDIT 2020-04-17:
Nach den berechtigten Hinweisen von Bitnugger habe ich nun doch aus der eigentlichen kleinen Hilfsfunktion eine komplexe UDF gemacht. Ich lasse mal die alte Version der Vollständigkeit halber im Post.
Dadurch ergibt sich nun auch eine größere Funktionsvielfalt.
- _Accelerator_Create
Erstellt einen neuen Accelerator (standardmäßig mit Dummy-Ctrl, optional für eine übergebene Ctrl-ID) - _Accelerator_GetID
Gibt die ID für einen übergebenen Hotkey zurück - _Accelerator_GetHotkey
Gibt den Hotkey für eine übergebene ID zurück - _Accelerator_ChangeHotkey
Verbindet einen neuen Hotkey mit der übergebenen Accelerator-ID - _Accelerator_Delete
Löscht einen Accelerator für die übergebene ID oder alle Accelerator für die übergebene GUI
Details wie immer in den Funktionsheadern.
Hier ein Bsp.:
AutoIt: Accelerators_Bsp.au3
;-- TIME_STAMP 2020-04-19 17:17:29
#include 'Accelerators.au3'
_Example()
Func _Example()
Local $aMsg, $hGui, $btn, $hGui2, $ID_1, $ID_2, $ID_3, $ID_4, $ID_5, $ID_6, $bDeleted = False, $bChanged = False
$hGui = GUICreate('Test')
$btn = GUICtrlCreateButton('Button', 50, 50, 100, 25)
_Accelerator_Create($hGui, '^+0', $btn)
$ID_1 = _Accelerator_Create($hGui, '^+1') ; Ctrl+Shift+1
$ID_2 = _Accelerator_Create($hGui, '^+2')
$ID_3 = _Accelerator_Create($hGui, '^+3')
$ID_4 = _Accelerator_Create($hGui, '^+4')
$hGui2 = GUICreate('Test 2')
$ID_5 = _Accelerator_Create($hGui2, '^+5')
$ID_6 = _Accelerator_Create($hGui2, '^+6')
GUISetState(@SW_SHOW, $hGui)
ConsoleWrite('Abfrage Accelerator für "$ID_3": ' & _Accelerator_GetHotkey($hGui, $ID_3) & @CRLF)
ConsoleWrite('Abfrage ID für Accelerator "^+3": ' & _Accelerator_GetID($hGui, '^+3') & @CRLF)
While True
$aMsg = GUIGetMsg(1)
Switch $aMsg[0]
Case -3
If $aMsg[1] = $hGui Then
Exit
Else
GUISetState(@SW_HIDE, $hGui2)
EndIf
Case $btn
MsgBox(0, '', 'Button per Klick/Hotkey aktiviert')
Case $ID_1
MsgBox(0, '', 'Hotkey für "ID_1" aufgerufen.')
ConsoleWrite('Hotkey für "ID_1" aufgerufen.' & @CRLF)
Case $ID_2
If Not $bChanged Then
MsgBox(0, '', 'Hotkey für "ID_2" aufgerufen.' & @LF & 'Ändere Hotkey für "$ID_2" zu <Ctrl+Shift+9>')
_Accelerator_ChangeHotkey($hGui, $ID_2, '^+9')
$bChanged = True
ConsoleWrite('Hotkey für "ID_2" aufgerufen. Hotkey für "$ID_2" zu <Ctrl+Shift+9> geändert.' & @CRLF)
Else
MsgBox(0, '', 'Neuen Hotkey für "ID_2" aufgerufen.')
ConsoleWrite('Neuen Hotkey für "ID_2" aufgerufen.' & @CRLF)
EndIf
Case $ID_3
If Not $bDeleted Then
MsgBox(0, '', 'Hotkey für "ID_3" aufgerufen.' & @LF & 'Lösche "$ID_1"')
_Accelerator_Delete($hGui, $ID_1)
$bDeleted = True
ConsoleWrite('Hotkey für "ID_3" aufgerufen. "$ID_1" gelöscht.' & @CRLF)
Else
MsgBox(0, '', 'Hotkey für "ID_3" aufgerufen.')
ConsoleWrite('Hotkey für "ID_3" aufgerufen.' & @CRLF)
EndIf
Case $ID_4
MsgBox(0, '', 'Hotkey für "ID_4" aufgerufen.' & @LF & 'Zeige Gui 2, Hotkeys dort: <Ctrl+Shift+5>, <Ctrl+Shift+6>')
GUISetState(@SW_SHOW, $hGui2)
ConsoleWrite('Hotkey für "ID_4" aufgerufen. Wechsel zu GUI2 mit dortigen Hotkeys: <Ctrl+Shift+5>, <Ctrl+Shift+6>' & @CRLF)
Case $ID_5
MsgBox(0, '', 'Hotkey für "ID_5" aufgerufen.')
ConsoleWrite('Hotkey für "ID_5" aufgerufen.' & @CRLF)
Case $ID_6
MsgBox(0, '', 'Hotkey für "ID_6" aufgerufen.' & @LF & 'Lösche alle Hotkeys auf dieser GUI.')
_Accelerator_Delete($hGui2)
ConsoleWrite('Hotkey für "ID_6" aufgerufen. Alle Hotkeys für GUI2 gelöscht.' & @CRLF)
EndSwitch
WEnd
EndFunc ;==>_Example
Alles anzeigen
alte Version
Hier habe ich die Erstellung von Dummy-Controls und ihre Anbindung an Accelerator-Keys mal in eine Funktion zusammengeführt. Finde ich etwas übersichtlicher.
Hier mal beide Varianten im direkten Vergleich:
Edit: Hinweis von alpines übernommen.
AutoIt
;-- TIME_STAMP 2020-04-15 11:38:04
_Example_1() ; der übliche Weg
_Example_2() ; mit "_GuiCreateDummyAccelerator"
Func _Example_1()
Local $hGui, $ID_1, $ID_2, $ID_3, $ID_4
$hGui = GUICreate('Test')
$ID_1 = GUICtrlCreateDummy() ; Ctrl+Shift+1
$ID_2 = GUICtrlCreateDummy()
$ID_3 = GUICtrlCreateDummy()
$ID_4 = GUICtrlCreateDummy()
Local $aAcc[4][2] = [['^+1',$ID_1],['^+2',$ID_2],['^+3',$ID_3],['^+4',$ID_4]]
GUISetAccelerators($aAcc)
GUISetState()
While True
Switch GUIGetMsg()
Case -3
ExitLoop
Case $ID_1
MsgBox(0, '', 'Hotkey für "ID_1" aufgerufen.')
Case $ID_2
MsgBox(0, '', 'Hotkey für "ID_2" aufgerufen.')
Case $ID_3
MsgBox(0, '', 'Hotkey für "ID_3" aufgerufen.')
Case $ID_4
MsgBox(0, '', 'Hotkey für "ID_4" aufgerufen.')
EndSwitch
WEnd
EndFunc
Func _Example_2()
Local $hGui, $ID_1, $ID_2, $ID_3, $ID_4
$hGui = GUICreate('Test')
$ID_1 = _GuiCreateDummyAccelerator($hGui, '^+1') ; Ctrl+Shift+1
$ID_2 = _GuiCreateDummyAccelerator($hGui, '^+2')
$ID_3 = _GuiCreateDummyAccelerator($hGui, '^+3')
$ID_4 = _GuiCreateDummyAccelerator($hGui, '^+4')
GUISetState()
While True
Switch GUIGetMsg()
Case -3
Exit
Case $ID_1
MsgBox(0, '', 'Hotkey für "ID_1" aufgerufen.')
Case $ID_2
MsgBox(0, '', 'Hotkey für "ID_2" aufgerufen.')
Case $ID_3
MsgBox(0, '', 'Hotkey für "ID_3" aufgerufen.')
Case $ID_4
MsgBox(0, '', 'Hotkey für "ID_4" aufgerufen.')
EndSwitch
WEnd
EndFunc
; #FUNCTION# =======================================================================================
; Name ..........: _GuiCreateDummyAccelerator
; Description ...: Creates a dummy control associated with a hotkey for a gui.
; Parameters ....: $_hWnd The gui handle
; ...............: $_HotKey The desired hotkey
; Return values .: Success The ID the hotkey is associated with.
; ...............: Failure 0 @error=1, hotkey already exists
; Author ........: BugFix
; ==================================================================================================
Func _GuiCreateDummyAccelerator($_hWnd, $_HotKey)
Local Static $aAccelerators[1][2] = [['empty']]
For $i = 0 To UBound($aAccelerators) -1
If $aAccelerators[$i][0] = $_HotKey Then Return SetError(1,0,0)
Next
If $aAccelerators[0][0] <> 'empty' Then
ReDim $aAccelerators[UBound($aAccelerators)+1][2]
EndIf
Local $dummy = GUICtrlCreateDummy()
$aAccelerators[UBound($aAccelerators)-1][0] = $_HotKey
$aAccelerators[UBound($aAccelerators)-1][1] = $dummy
GUISetAccelerators($aAccelerators, $_hWnd)
Return $dummy
EndFunc ;==>_GuiCreateDummyAccelerator
Alles anzeigen