443 lines
14 KiB
Go
443 lines
14 KiB
Go
// Copyright 2013 The Walk Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// +build windows
|
|
|
|
package walk
|
|
|
|
import (
|
|
"bytes"
|
|
)
|
|
|
|
import (
|
|
"github.com/lxn/win"
|
|
)
|
|
|
|
type Key uint16
|
|
|
|
func (k Key) String() string {
|
|
return key2string[k]
|
|
}
|
|
|
|
const (
|
|
KeyLButton Key = win.VK_LBUTTON
|
|
KeyRButton Key = win.VK_RBUTTON
|
|
KeyCancel Key = win.VK_CANCEL
|
|
KeyMButton Key = win.VK_MBUTTON
|
|
KeyXButton1 Key = win.VK_XBUTTON1
|
|
KeyXButton2 Key = win.VK_XBUTTON2
|
|
KeyBack Key = win.VK_BACK
|
|
KeyTab Key = win.VK_TAB
|
|
KeyClear Key = win.VK_CLEAR
|
|
KeyReturn Key = win.VK_RETURN
|
|
KeyShift Key = win.VK_SHIFT
|
|
KeyControl Key = win.VK_CONTROL
|
|
KeyAlt Key = win.VK_MENU
|
|
KeyMenu Key = win.VK_MENU
|
|
KeyPause Key = win.VK_PAUSE
|
|
KeyCapital Key = win.VK_CAPITAL
|
|
KeyKana Key = win.VK_KANA
|
|
KeyHangul Key = win.VK_HANGUL
|
|
KeyJunja Key = win.VK_JUNJA
|
|
KeyFinal Key = win.VK_FINAL
|
|
KeyHanja Key = win.VK_HANJA
|
|
KeyKanji Key = win.VK_KANJI
|
|
KeyEscape Key = win.VK_ESCAPE
|
|
KeyConvert Key = win.VK_CONVERT
|
|
KeyNonconvert Key = win.VK_NONCONVERT
|
|
KeyAccept Key = win.VK_ACCEPT
|
|
KeyModeChange Key = win.VK_MODECHANGE
|
|
KeySpace Key = win.VK_SPACE
|
|
KeyPrior Key = win.VK_PRIOR
|
|
KeyNext Key = win.VK_NEXT
|
|
KeyEnd Key = win.VK_END
|
|
KeyHome Key = win.VK_HOME
|
|
KeyLeft Key = win.VK_LEFT
|
|
KeyUp Key = win.VK_UP
|
|
KeyRight Key = win.VK_RIGHT
|
|
KeyDown Key = win.VK_DOWN
|
|
KeySelect Key = win.VK_SELECT
|
|
KeyPrint Key = win.VK_PRINT
|
|
KeyExecute Key = win.VK_EXECUTE
|
|
KeySnapshot Key = win.VK_SNAPSHOT
|
|
KeyInsert Key = win.VK_INSERT
|
|
KeyDelete Key = win.VK_DELETE
|
|
KeyHelp Key = win.VK_HELP
|
|
Key0 Key = 0x30
|
|
Key1 Key = 0x31
|
|
Key2 Key = 0x32
|
|
Key3 Key = 0x33
|
|
Key4 Key = 0x34
|
|
Key5 Key = 0x35
|
|
Key6 Key = 0x36
|
|
Key7 Key = 0x37
|
|
Key8 Key = 0x38
|
|
Key9 Key = 0x39
|
|
KeyA Key = 0x41
|
|
KeyB Key = 0x42
|
|
KeyC Key = 0x43
|
|
KeyD Key = 0x44
|
|
KeyE Key = 0x45
|
|
KeyF Key = 0x46
|
|
KeyG Key = 0x47
|
|
KeyH Key = 0x48
|
|
KeyI Key = 0x49
|
|
KeyJ Key = 0x4A
|
|
KeyK Key = 0x4B
|
|
KeyL Key = 0x4C
|
|
KeyM Key = 0x4D
|
|
KeyN Key = 0x4E
|
|
KeyO Key = 0x4F
|
|
KeyP Key = 0x50
|
|
KeyQ Key = 0x51
|
|
KeyR Key = 0x52
|
|
KeyS Key = 0x53
|
|
KeyT Key = 0x54
|
|
KeyU Key = 0x55
|
|
KeyV Key = 0x56
|
|
KeyW Key = 0x57
|
|
KeyX Key = 0x58
|
|
KeyY Key = 0x59
|
|
KeyZ Key = 0x5A
|
|
KeyLWin Key = win.VK_LWIN
|
|
KeyRWin Key = win.VK_RWIN
|
|
KeyApps Key = win.VK_APPS
|
|
KeySleep Key = win.VK_SLEEP
|
|
KeyNumpad0 Key = win.VK_NUMPAD0
|
|
KeyNumpad1 Key = win.VK_NUMPAD1
|
|
KeyNumpad2 Key = win.VK_NUMPAD2
|
|
KeyNumpad3 Key = win.VK_NUMPAD3
|
|
KeyNumpad4 Key = win.VK_NUMPAD4
|
|
KeyNumpad5 Key = win.VK_NUMPAD5
|
|
KeyNumpad6 Key = win.VK_NUMPAD6
|
|
KeyNumpad7 Key = win.VK_NUMPAD7
|
|
KeyNumpad8 Key = win.VK_NUMPAD8
|
|
KeyNumpad9 Key = win.VK_NUMPAD9
|
|
KeyMultiply Key = win.VK_MULTIPLY
|
|
KeyAdd Key = win.VK_ADD
|
|
KeySeparator Key = win.VK_SEPARATOR
|
|
KeySubtract Key = win.VK_SUBTRACT
|
|
KeyDecimal Key = win.VK_DECIMAL
|
|
KeyDivide Key = win.VK_DIVIDE
|
|
KeyF1 Key = win.VK_F1
|
|
KeyF2 Key = win.VK_F2
|
|
KeyF3 Key = win.VK_F3
|
|
KeyF4 Key = win.VK_F4
|
|
KeyF5 Key = win.VK_F5
|
|
KeyF6 Key = win.VK_F6
|
|
KeyF7 Key = win.VK_F7
|
|
KeyF8 Key = win.VK_F8
|
|
KeyF9 Key = win.VK_F9
|
|
KeyF10 Key = win.VK_F10
|
|
KeyF11 Key = win.VK_F11
|
|
KeyF12 Key = win.VK_F12
|
|
KeyF13 Key = win.VK_F13
|
|
KeyF14 Key = win.VK_F14
|
|
KeyF15 Key = win.VK_F15
|
|
KeyF16 Key = win.VK_F16
|
|
KeyF17 Key = win.VK_F17
|
|
KeyF18 Key = win.VK_F18
|
|
KeyF19 Key = win.VK_F19
|
|
KeyF20 Key = win.VK_F20
|
|
KeyF21 Key = win.VK_F21
|
|
KeyF22 Key = win.VK_F22
|
|
KeyF23 Key = win.VK_F23
|
|
KeyF24 Key = win.VK_F24
|
|
KeyNumlock Key = win.VK_NUMLOCK
|
|
KeyScroll Key = win.VK_SCROLL
|
|
KeyLShift Key = win.VK_LSHIFT
|
|
KeyRShift Key = win.VK_RSHIFT
|
|
KeyLControl Key = win.VK_LCONTROL
|
|
KeyRControl Key = win.VK_RCONTROL
|
|
KeyLAlt Key = win.VK_LMENU
|
|
KeyLMenu Key = win.VK_LMENU
|
|
KeyRAlt Key = win.VK_RMENU
|
|
KeyRMenu Key = win.VK_RMENU
|
|
KeyBrowserBack Key = win.VK_BROWSER_BACK
|
|
KeyBrowserForward Key = win.VK_BROWSER_FORWARD
|
|
KeyBrowserRefresh Key = win.VK_BROWSER_REFRESH
|
|
KeyBrowserStop Key = win.VK_BROWSER_STOP
|
|
KeyBrowserSearch Key = win.VK_BROWSER_SEARCH
|
|
KeyBrowserFavorites Key = win.VK_BROWSER_FAVORITES
|
|
KeyBrowserHome Key = win.VK_BROWSER_HOME
|
|
KeyVolumeMute Key = win.VK_VOLUME_MUTE
|
|
KeyVolumeDown Key = win.VK_VOLUME_DOWN
|
|
KeyVolumeUp Key = win.VK_VOLUME_UP
|
|
KeyMediaNextTrack Key = win.VK_MEDIA_NEXT_TRACK
|
|
KeyMediaPrevTrack Key = win.VK_MEDIA_PREV_TRACK
|
|
KeyMediaStop Key = win.VK_MEDIA_STOP
|
|
KeyMediaPlayPause Key = win.VK_MEDIA_PLAY_PAUSE
|
|
KeyLaunchMail Key = win.VK_LAUNCH_MAIL
|
|
KeyLaunchMediaSelect Key = win.VK_LAUNCH_MEDIA_SELECT
|
|
KeyLaunchApp1 Key = win.VK_LAUNCH_APP1
|
|
KeyLaunchApp2 Key = win.VK_LAUNCH_APP2
|
|
KeyOEM1 Key = win.VK_OEM_1
|
|
KeyOEMPlus Key = win.VK_OEM_PLUS
|
|
KeyOEMComma Key = win.VK_OEM_COMMA
|
|
KeyOEMMinus Key = win.VK_OEM_MINUS
|
|
KeyOEMPeriod Key = win.VK_OEM_PERIOD
|
|
KeyOEM2 Key = win.VK_OEM_2
|
|
KeyOEM3 Key = win.VK_OEM_3
|
|
KeyOEM4 Key = win.VK_OEM_4
|
|
KeyOEM5 Key = win.VK_OEM_5
|
|
KeyOEM6 Key = win.VK_OEM_6
|
|
KeyOEM7 Key = win.VK_OEM_7
|
|
KeyOEM8 Key = win.VK_OEM_8
|
|
KeyOEM102 Key = win.VK_OEM_102
|
|
KeyProcessKey Key = win.VK_PROCESSKEY
|
|
KeyPacket Key = win.VK_PACKET
|
|
KeyAttn Key = win.VK_ATTN
|
|
KeyCRSel Key = win.VK_CRSEL
|
|
KeyEXSel Key = win.VK_EXSEL
|
|
KeyErEOF Key = win.VK_EREOF
|
|
KeyPlay Key = win.VK_PLAY
|
|
KeyZoom Key = win.VK_ZOOM
|
|
KeyNoName Key = win.VK_NONAME
|
|
KeyPA1 Key = win.VK_PA1
|
|
KeyOEMClear Key = win.VK_OEM_CLEAR
|
|
)
|
|
|
|
var key2string = map[Key]string{
|
|
KeyLButton: "LButton",
|
|
KeyRButton: "RButton",
|
|
KeyCancel: "Cancel",
|
|
KeyMButton: "MButton",
|
|
KeyXButton1: "XButton1",
|
|
KeyXButton2: "XButton2",
|
|
KeyBack: "Back",
|
|
KeyTab: "Tab",
|
|
KeyClear: "Clear",
|
|
KeyReturn: "Return",
|
|
KeyShift: "Shift",
|
|
KeyControl: "Control",
|
|
KeyAlt: "Alt / Menu",
|
|
KeyPause: "Pause",
|
|
KeyCapital: "Capital",
|
|
KeyKana: "Kana / Hangul",
|
|
KeyJunja: "Junja",
|
|
KeyFinal: "Final",
|
|
KeyHanja: "Hanja / Kanji",
|
|
KeyEscape: "Escape",
|
|
KeyConvert: "Convert",
|
|
KeyNonconvert: "Nonconvert",
|
|
KeyAccept: "Accept",
|
|
KeyModeChange: "ModeChange",
|
|
KeySpace: "Space",
|
|
KeyPrior: "Prior",
|
|
KeyNext: "Next",
|
|
KeyEnd: "End",
|
|
KeyHome: "Home",
|
|
KeyLeft: "Left",
|
|
KeyUp: "Up",
|
|
KeyRight: "Right",
|
|
KeyDown: "Down",
|
|
KeySelect: "Select",
|
|
KeyPrint: "Print",
|
|
KeyExecute: "Execute",
|
|
KeySnapshot: "Snapshot",
|
|
KeyInsert: "Insert",
|
|
KeyDelete: "Delete",
|
|
KeyHelp: "Help",
|
|
Key0: "0",
|
|
Key1: "1",
|
|
Key2: "2",
|
|
Key3: "3",
|
|
Key4: "4",
|
|
Key5: "5",
|
|
Key6: "6",
|
|
Key7: "7",
|
|
Key8: "8",
|
|
Key9: "9",
|
|
KeyA: "A",
|
|
KeyB: "B",
|
|
KeyC: "C",
|
|
KeyD: "D",
|
|
KeyE: "E",
|
|
KeyF: "F",
|
|
KeyG: "G",
|
|
KeyH: "H",
|
|
KeyI: "I",
|
|
KeyJ: "J",
|
|
KeyK: "K",
|
|
KeyL: "L",
|
|
KeyM: "M",
|
|
KeyN: "N",
|
|
KeyO: "O",
|
|
KeyP: "P",
|
|
KeyQ: "Q",
|
|
KeyR: "R",
|
|
KeyS: "S",
|
|
KeyT: "T",
|
|
KeyU: "U",
|
|
KeyV: "V",
|
|
KeyW: "W",
|
|
KeyX: "X",
|
|
KeyY: "Y",
|
|
KeyZ: "Z",
|
|
KeyLWin: "LWin",
|
|
KeyRWin: "RWin",
|
|
KeyApps: "Apps",
|
|
KeySleep: "Sleep",
|
|
KeyNumpad0: "Numpad0",
|
|
KeyNumpad1: "Numpad1",
|
|
KeyNumpad2: "Numpad2",
|
|
KeyNumpad3: "Numpad3",
|
|
KeyNumpad4: "Numpad4",
|
|
KeyNumpad5: "Numpad5",
|
|
KeyNumpad6: "Numpad6",
|
|
KeyNumpad7: "Numpad7",
|
|
KeyNumpad8: "Numpad8",
|
|
KeyNumpad9: "Numpad9",
|
|
KeyMultiply: "Multiply",
|
|
KeyAdd: "Add",
|
|
KeySeparator: "Separator",
|
|
KeySubtract: "Subtract",
|
|
KeyDecimal: "Decimal",
|
|
KeyDivide: "Divide",
|
|
KeyF1: "F1",
|
|
KeyF2: "F2",
|
|
KeyF3: "F3",
|
|
KeyF4: "F4",
|
|
KeyF5: "F5",
|
|
KeyF6: "F6",
|
|
KeyF7: "F7",
|
|
KeyF8: "F8",
|
|
KeyF9: "F9",
|
|
KeyF10: "F10",
|
|
KeyF11: "F11",
|
|
KeyF12: "F12",
|
|
KeyF13: "F13",
|
|
KeyF14: "F14",
|
|
KeyF15: "F15",
|
|
KeyF16: "F16",
|
|
KeyF17: "F17",
|
|
KeyF18: "F18",
|
|
KeyF19: "F19",
|
|
KeyF20: "F20",
|
|
KeyF21: "F21",
|
|
KeyF22: "F22",
|
|
KeyF23: "F23",
|
|
KeyF24: "F24",
|
|
KeyNumlock: "Numlock",
|
|
KeyScroll: "Scroll",
|
|
KeyLShift: "LShift",
|
|
KeyRShift: "RShift",
|
|
KeyLControl: "LControl",
|
|
KeyRControl: "RControl",
|
|
KeyLMenu: "LMenu",
|
|
KeyRMenu: "RMenu",
|
|
KeyBrowserBack: "BrowserBack",
|
|
KeyBrowserForward: "BrowserForward",
|
|
KeyBrowserRefresh: "BrowserRefresh",
|
|
KeyBrowserStop: "BrowserStop",
|
|
KeyBrowserSearch: "BrowserSearch",
|
|
KeyBrowserFavorites: "BrowserFavorites",
|
|
KeyBrowserHome: "BrowserHome",
|
|
KeyVolumeMute: "VolumeMute",
|
|
KeyVolumeDown: "VolumeDown",
|
|
KeyVolumeUp: "VolumeUp",
|
|
KeyMediaNextTrack: "MediaNextTrack",
|
|
KeyMediaPrevTrack: "MediaPrevTrack",
|
|
KeyMediaStop: "MediaStop",
|
|
KeyMediaPlayPause: "MediaPlayPause",
|
|
KeyLaunchMail: "LaunchMail",
|
|
KeyLaunchMediaSelect: "LaunchMediaSelect",
|
|
KeyLaunchApp1: "LaunchApp1",
|
|
KeyLaunchApp2: "LaunchApp2",
|
|
KeyOEM1: "OEM1",
|
|
KeyOEMPlus: "OEMPlus",
|
|
KeyOEMComma: "OEMComma",
|
|
KeyOEMMinus: "OEMMinus",
|
|
KeyOEMPeriod: "OEMPeriod",
|
|
KeyOEM2: "OEM2",
|
|
KeyOEM3: "OEM3",
|
|
KeyOEM4: "OEM4",
|
|
KeyOEM5: "OEM5",
|
|
KeyOEM6: "OEM6",
|
|
KeyOEM7: "OEM7",
|
|
KeyOEM8: "OEM8",
|
|
KeyOEM102: "OEM102",
|
|
KeyProcessKey: "ProcessKey",
|
|
KeyPacket: "Packet",
|
|
KeyAttn: "Attn",
|
|
KeyCRSel: "CRSel",
|
|
KeyEXSel: "EXSel",
|
|
KeyErEOF: "ErEOF",
|
|
KeyPlay: "Play",
|
|
KeyZoom: "Zoom",
|
|
KeyNoName: "NoName",
|
|
KeyPA1: "PA1",
|
|
KeyOEMClear: "OEMClear",
|
|
}
|
|
|
|
type Modifiers byte
|
|
|
|
func (m Modifiers) String() string {
|
|
return modifiers2string[m]
|
|
}
|
|
|
|
var modifiers2string = map[Modifiers]string{
|
|
ModShift: "Shift",
|
|
ModControl: "Ctrl",
|
|
ModControl | ModShift: "Ctrl+Shift",
|
|
ModAlt: "Alt",
|
|
ModAlt | ModShift: "Alt+Shift",
|
|
ModAlt | ModControl: "Alt+Ctrl",
|
|
ModAlt | ModControl | ModShift: "Alt+Ctrl+Shift",
|
|
}
|
|
|
|
const (
|
|
ModShift Modifiers = 1 << iota
|
|
ModControl
|
|
ModAlt
|
|
)
|
|
|
|
func ModifiersDown() Modifiers {
|
|
var m Modifiers
|
|
|
|
if ShiftDown() {
|
|
m |= ModShift
|
|
}
|
|
if ControlDown() {
|
|
m |= ModControl
|
|
}
|
|
if AltDown() {
|
|
m |= ModAlt
|
|
}
|
|
|
|
return m
|
|
}
|
|
|
|
type Shortcut struct {
|
|
Modifiers Modifiers
|
|
Key Key
|
|
}
|
|
|
|
func (s Shortcut) String() string {
|
|
m := s.Modifiers.String()
|
|
if m == "" {
|
|
return s.Key.String()
|
|
}
|
|
|
|
b := new(bytes.Buffer)
|
|
|
|
b.WriteString(m)
|
|
b.WriteRune('+')
|
|
b.WriteString(s.Key.String())
|
|
|
|
return b.String()
|
|
}
|
|
|
|
func AltDown() bool {
|
|
return win.GetKeyState(int32(KeyAlt))>>15 != 0
|
|
}
|
|
|
|
func ControlDown() bool {
|
|
return win.GetKeyState(int32(KeyControl))>>15 != 0
|
|
}
|
|
|
|
func ShiftDown() bool {
|
|
return win.GetKeyState(int32(KeyShift))>>15 != 0
|
|
}
|