HotkeyControl

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
[chaos]
Beiträge: 9
Registriert: 04.08.2006 14:40
Wohnort: Ludwigshafen
Kontaktdaten:

HotkeyControl

Beitrag von [chaos] »

Ich war mal vor langer Zeit auf der Suche nach einem Code womit man Tastatureingaben wie STRG+ALT+F direkt in einem StringGadget einfangen konnte. Was bei Hotkey-Eingaben so üblich ist.

Da "TaskSwitchXP" sowas implementiert hatte, portierte ich kurzerhand die Codes, anstatt was eigenes aufzustellen.

Über den Code selbst hab ich nicht viel zu sagen. Ein StringGadget wird mit einem Callback bestückt und ein KeyboardHook fängt die Tastatureingaben ab. Der Wert wird als UserData in das StringGadget geschrieben.

WinHotkeyCtrl.pb

Code: Alles auswählen

;///////////////////////////////////////////////////////////////
;// WinHotkeyCtrl.pb                                          //
;// vkCodes.pb                                                // 
;//                                                           //
;// Notice: The original code can be found here               //
;// http://www.ntwind.com/software/taskswitchxp/download.html //
;// Copyright © 2004-2006 by Alexander Avdonin                //
;//                                                           //
;// Portet into PureBasic by Tobias Bohrmann                  //
;///////////////////////////////////////////////////////////////

#MOD_ALT = $0001
#MOD_CONTROL = $0002
#MOD_SHIFT = $0004
#MOD_WIN = $0008
#WM_KEY	= #WM_USER + 444
#VK_BROWSER_BACK = 166
#VK_LAUNCH_APP2	= 183
#TPM_NONOTIFY = 128
#TPM_RETURNCMD = 256

Structure KEYBOARDHOOKSTRUCTURE
  vkCode.l 
  scanCode.l 
  flags.l 
  time.l 
  dwExtraInfo.l 
EndStructure

Declare _WinHotkeyCtrlProc(hwnd, uMsg, wParam, lParam)
Declare SetHotkey(hwndWhc.l, dwHk.w)

Global _wpEditProc, _hwndWhc, _hhookKb

XIncludeFile "vkCodes.pb"

Procedure LOBYTE(Word.w)
  ProcedureReturn Word & $FF
EndProcedure

Procedure HIBYTE(Word.w)
  ProcedureReturn (Word >> 8) & $FF
EndProcedure

Procedure LOWORD(Long.l)
  ProcedureReturn Long & $FFFF
EndProcedure

Procedure HIWORD(Long.l)
  ProcedureReturn (Long >> 16) & $FFFF
EndProcedure

Procedure MAKEWHCDATA(vkCode, fModSet, fModRel, fIsPressed)
  ProcedureReturn ((vkCode & $FF) | ((fModSet & $FF) << 8) | ((fModRel & $FF) << 16) | ((fIsPressed & $FF) << 24))
EndProcedure

Procedure InitWinHotkeyCtrls()
	wcex.WNDCLASSEX
	wcex\cbSize = SizeOf(WNDCLASSEX)
	
	If Not GetClassInfoEx_(GetModuleHandle_(NULL), "Edit", @wcex)
		ProcedureReturn #False
  EndIf
  
	_wpEditProc = wcex\lpfnWndProc

  ProcedureReturn _wpEditProc
EndProcedure

Procedure SetHotkeyControl(hwndWhc.l) ;// SubClassWinHotkeyCtrl(hwndWhc.l) //
	If Not _wpEditProc
		If Not InitWinHotkeyCtrls()
			ProcedureReturn #False
		EndIf
  EndIf

	SetWindowLong_(hwndWhc, #GWL_WNDPROC, @_WinHotkeyCtrlProc())
  SetHotkey(hwndWhc, MAKEWHCDATA(0, 0, 0, 0))

	ProcedureReturn #True
EndProcedure

Procedure _LowLevelKeyboardProc(nCode.l, wParam.l, *kb.KEYBOARDHOOKSTRUCTURE)
  If (nCode = #HC_ACTION And (wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP))
    PostMessage_(_hwndWhc, #WM_KEY, *kb\vkCode, (wParam & 1))
  EndIf
  
  ProcedureReturn #True
EndProcedure

Procedure _UninstallKbHook()
	fOk = #False
	If _hhookKb
		fOk = UnhookWindowsHookEx_(_hhookKb)
		_hhookKb = #Null
	EndIf
	
	_hwndWhc = #Null
	
	ProcedureReturn fOk
EndProcedure

Procedure _InstallKbHook(hwndWhc.l)
  If (_hhookKb)
		_UninstallKbHook()
  EndIf
  
  _hwndWhc = hwndWhc
	_hhookKb = SetWindowsHookEx_(#WH_KEYBOARD_LL, @_LowLevelKeyboardProc(), GetModuleHandle_(#Null), #Null)

	ProcedureReturn _hhookKb
EndProcedure

Procedure _SetWhcText(hwndWhc.l, dwHk.w)
   Protected StrHk.s
   
   StrHk = HotkeyToString(LOBYTE(LOWORD(dwHk)), HIBYTE(LOWORD(dwHk)))

   If StrHk
     SetWindowText_(hwndWhc, StrHk)
   Else
     SetWindowText_(hwndWhc, "None")
   EndIf
   
   SendMessage_(hwndWhc, #EM_SETSEL, $8FFFFFFF, $8FFFFFFF)
EndProcedure

Procedure GetHotkey(hwndWhc.l)
  ProcedureReturn LOWORD(GetWindowLong_(hwndWhc, #GWL_USERDATA))
EndProcedure

Procedure SetHotkey(hwndWhc.l, dwHk.w)
  _SetWhcText(hwndWhc, dwHk)
  SetWindowLong_(hwndWhc, #GWL_USERDATA, dwHk)
EndProcedure

Procedure _WinHotkeyCtrlProc(hwnd.l, uMsg.l, wParam.l, lParam.l)
  Static vkCode, fModSet, fModRel, fIsPressed, fMod, fRedraw

  Select uMsg
    Case #WM_KEY
      dwWhcData = GetWindowLong_(hwnd, #GWL_USERDATA);
    
      vkCode = LOBYTE(LOWORD(dwWhcData))
      fModSet = HIBYTE(LOWORD(dwWhcData))
      fModRel = LOBYTE(HIWORD(dwWhcData))
      fIsPressed = HIBYTE(HIWORD(dwWhcData))

      fMod = 0
      fRedraw = #True

      Select wParam
        Case #VK_LWIN
          fMod = #MOD_WIN
          
        Case #VK_RWIN
          fMod = #MOD_WIN
          
        Case #VK_CONTROL
          fMod = #MOD_CONTROL
          
        Case #VK_LCONTROL
          fMod = #MOD_CONTROL
          
        Case #VK_RCONTROL
          fMod = #MOD_CONTROL
          
        Case #VK_MENU
          fMod = #MOD_ALT
          
        Case #VK_LMENU
          fMod = #MOD_ALT
           
        Case #VK_RMENU
          fMod = #MOD_ALT
          
        Case #VK_SHIFT
          fMod = #MOD_SHIFT
          
        Case #VK_LSHIFT
          fMod = #MOD_SHIFT
          
        Case #VK_RSHIFT
          fMod = #MOD_SHIFT
          
      EndSelect

      If fMod
        If Not lParam
          If Not fIsPressed And vkCode
            fModSet = 0
            fModRel = 0
            vkCode = 0
          EndIf 
          
          fModRel & ~fMod
        ElseIf (fModSet & fMod)
          fModRel | fMod
        EndIf

        If fIsPressed Or Not vkCode
          If Not lParam
            If Not (fModSet & fMod)
              fModSet | fMod
            Else
              fRedraw = #False
            EndIf
          Else
            fModSet & ~fMod
          EndIf
        EndIf
      Else
        If (wParam = #VK_DELETE And fModSet = (#MOD_CONTROL | #MOD_ALT))
          fModSet = 0
          fModRel = 0
          vkCode = 0
          fIsPressed = #False
         ElseIf (wParam = vkCode And lParam)
           fIsPressed = #False
           fRedraw = #False
         Else
           If (Not fIsPressed And Not lParam)
             If (fModRel & fModSet)
               fModSet = 0
               fModRel = 0
             EndIf
             
             vkCode = wParam
             fIsPressed = #True
           EndIf
         EndIf
       EndIf
       
       dwWhcData = MAKEWHCDATA(vkCode, fModSet, fModRel, fIsPressed)
       SetWindowLong_(hwnd, #GWL_USERDATA, dwWhcData)

       If fRedraw
         _SetWhcText(hwnd, dwWhcData)

         ProcedureReturn 0
       EndIf

    Case #WM_SETFOCUS
      _InstallKbHook(hwnd)

    Case #WM_KILLFOCUS
      _UninstallKbHook()
            
    Case #WM_CONTEXTMENU
      hmenu = CreatePopupMenu_()

      hmenu2 = CreatePopupMenu_()
        
      For id = #VK_BROWSER_BACK To #VK_LAUNCH_APP2
        AppendMenu_(hmenu2, #MF_STRING, id, GetKeyName(id))
      Next id
          
      AppendMenu_(hmenu, #MF_STRING | #MF_POPUP, hmenu2, "Multimedia")

      hmenu2 = CreatePopupMenu_()
      
      AppendMenu_(hmenu2, #MF_STRING, #VK_RETURN, GetKeyName(#VK_RETURN))
      AppendMenu_(hmenu2, #MF_STRING, #VK_ESCAPE, GetKeyName(#VK_ESCAPE))
      AppendMenu_(hmenu2, #MF_STRING, #VK_TAB, GetKeyName(#VK_TAB))
      AppendMenu_(hmenu2, #MF_STRING, #VK_CAPITAL, GetKeyName(#VK_CAPITAL))
      AppendMenu_(hmenu2, #MF_STRING, #VK_BACK, GetKeyName(#VK_BACK))
      AppendMenu_(hmenu2, #MF_STRING, #VK_INSERT, GetKeyName(#VK_INSERT))
      AppendMenu_(hmenu2, #MF_STRING, #VK_DELETE, GetKeyName(#VK_DELETE))
      
      For id = #VK_SPACE To #VK_DOWN
        AppendMenu_(hmenu2, #MF_STRING, id, GetKeyName(id))
      Next id
            
      AppendMenu_(hmenu, #MF_STRING | #MF_POPUP, hmenu2, "Standard")

      hmenu2 = CreatePopupMenu_()
      
      For id = #VK_F1 To #VK_F24
        AppendMenu_(hmenu2, #MF_STRING, id, GetKeyName(id))
      Next id
      
      AppendMenu_(hmenu, #MF_STRING | #MF_POPUP, hmenu2, "Functionality")
      AppendMenu_(hmenu, #MF_SEPARATOR, 0, #Null)
      
      If fModSet & #MOD_WIN
        AppendMenu_(hmenu, #MF_STRING | #MF_CHECKED, #VK_LWIN, "Win-key")
      Else
        AppendMenu_(hmenu, #MF_STRING, #VK_LWIN, "Win-key")
      EndIf
      
      If fModSet & #MOD_CONTROL
        AppendMenu_(hmenu, #MF_STRING | #MF_CHECKED, #VK_CONTROL, "Control-key")
      Else
        AppendMenu_(hmenu, #MF_STRING, #VK_CONTROL, "Control-key")
      EndIf
      
      If fModSet & #MOD_SHIFT
        AppendMenu_(hmenu, #MF_STRING | #MF_CHECKED, #VK_SHIFT, "Shift-key")
      Else
        AppendMenu_(hmenu, #MF_STRING, #VK_SHIFT, "Shift-key")
      EndIf
      
      If fModSet & #MOD_ALT
        AppendMenu_(hmenu, #MF_STRING | #MF_CHECKED, #VK_MENU, "Alt-key")
      Else
        AppendMenu_(hmenu, #MF_STRING, #VK_MENU, "Alt-key")
      EndIf
            
      uMenuID = TrackPopupMenu_(hmenu, #TPM_RIGHTALIGN | #TPM_RIGHTBUTTON | #TPM_NONOTIFY | #TPM_RETURNCMD, LOWORD(lParam), HIWORD(lParam), 0, hwnd, #Null);

      If uMenuID > 0 And uMenuID < 256
        Select uMenuID
          Case #VK_LWIN
            If vkCode
              fModSet ! #MOD_WIN
              fModRel | (fModSet & #MOD_WIN)
            EndIf
                        
          Case #VK_CONTROL
            If vkCode
              fModSet ! #MOD_CONTROL
              fModRel | (fModSet & #MOD_CONTROL)
            EndIf
                        
          Case #VK_SHIFT
            If vkCode
              fModSet ! #MOD_SHIFT
              fModRel | (fModSet & #MOD_SHIFT)
            EndIf
                        
          Case #VK_MENU
            If vkCode
              fModSet ! #MOD_ALT
              fModRel | (fModSet & #MOD_ALT)
            EndIf

          Default
            vkCode = uMenuID
            fIsPressed = #False
        EndSelect

        dwWhcData = MAKEWHCDATA(vkCode, fModSet, fModRel, fIsPressed)
        SetWindowLong_(hwnd, #GWL_USERDATA, dwWhcData);
        _SetWhcText(hwnd, dwWhcData)
        SetFocus_(hwnd)
      EndIf
      
      DestroyMenu_(hmenu)
      
      ProcedureReturn #False
      
    Case #WM_CHAR
      ProcedureReturn #False
      
    Case #WM_SETCURSOR
      ProcedureReturn #False

    Case #WM_DESTROY
      If hwnd = _hwndWhc
        _UninstallKbHook()
      EndIf
  EndSelect
  
  ProcedureReturn CallWindowProc_(_wpEditProc, hwnd, uMsg, wParam, lParam)
EndProcedure
vkCodes.pb

Code: Alles auswählen

Global Dim s_pszKeys.s(255)

Procedure.s GetKeyName(vkCode)
	vkCode & $FF

	s_pszKeys(0) = "Unused"
	s_pszKeys(1) = "Left mouse button"
	s_pszKeys(2) = "Right mouse button"
	s_pszKeys(3) = "Control-break"
	s_pszKeys(4) = "Middle mouse button"
	s_pszKeys(5) = "X1 mouse button"
	s_pszKeys(6) = "X2 mouse button"
	s_pszKeys(7) = "Undefined"
	s_pszKeys(8) = "Backspace" 
	s_pszKeys(9) = "Tab"
	s_pszKeys(10) = "Unknown"
	s_pszKeys(11) = "Unknown"
	s_pszKeys(12) = "Clear"
	s_pszKeys(13) = "Enter"
	s_pszKeys(14) = "Unknown"
	s_pszKeys(15) = "Unknown"
	s_pszKeys(16) = "Shift"
	s_pszKeys(17) = "Control" 
	s_pszKeys(18) = "Alt"
	s_pszKeys(19) = "Pause"
	s_pszKeys(20) = "Caps Lock"
	s_pszKeys(21) = "IME Kana mode"
	s_pszKeys(22) = "Unknown"
	s_pszKeys(23) = "IME Junja mode"
	s_pszKeys(24) = "IME final mode"
	s_pszKeys(25) = "IME Hanja mode"
	s_pszKeys(26) = "Unknown"
	s_pszKeys(27) = "Esc"
	s_pszKeys(28) = "IME convert"
	s_pszKeys(29) = "IME nonconvert"
	s_pszKeys(30) = "IME accept"
	s_pszKeys(31) = "IME mode change"
	s_pszKeys(32) = "Space"
	s_pszKeys(33) = "Page Up"
	s_pszKeys(34) = "Page Down"
	s_pszKeys(35) = "End"
	s_pszKeys(36) = "Home"
	s_pszKeys(37) = "Left Arrow"
	s_pszKeys(38) = "Up Arrow"
	s_pszKeys(39) = "Right Arrow"
	s_pszKeys(40) = "Down Arrow"
	s_pszKeys(41) = "Select"
	s_pszKeys(42) = "Print"
	s_pszKeys(43) = "Execute"
	s_pszKeys(44) = "Print Screen"
	s_pszKeys(45) = "Insert"
	s_pszKeys(46) = "Delete"
	s_pszKeys(47) = "Help"
	s_pszKeys(48) = "0"
	s_pszKeys(49) = "1"
	s_pszKeys(50) = "2"
	s_pszKeys(51) = "3"
	s_pszKeys(52) = "4"
	s_pszKeys(53) = "5"
	s_pszKeys(54) = "6"
	s_pszKeys(55) = "7"
	s_pszKeys(56) = "8"
	s_pszKeys(57) = "9"
	s_pszKeys(58) = "Unknown"
	s_pszKeys(59) = "Unknown"
	s_pszKeys(60) = "Unknown"
	s_pszKeys(61) = "Unknown"
	s_pszKeys(62) = "Unknown"
	s_pszKeys(63) = "Unknown"
	s_pszKeys(64) = "Unknown"
	s_pszKeys(65) = "A"
	s_pszKeys(66) = "B"
	s_pszKeys(67) = "C"
	s_pszKeys(68) = "D"
	s_pszKeys(69) = "E"
	s_pszKeys(70) = "F"
	s_pszKeys(71) = "G"
	s_pszKeys(72) = "H"
	s_pszKeys(73) = "I"
	s_pszKeys(74) = "J"
	s_pszKeys(75) = "K"
	s_pszKeys(76) = "L"
	s_pszKeys(77) = "M"
	s_pszKeys(78) = "N"
	s_pszKeys(79) = "O"
	s_pszKeys(80) = "P"
	s_pszKeys(81) = "Q"
	s_pszKeys(82) = "R"
	s_pszKeys(83) = "S"
	s_pszKeys(84) = "T"
	s_pszKeys(85) = "U"
	s_pszKeys(86) = "V"
	s_pszKeys(87) = "W"
	s_pszKeys(88) = "X"
	s_pszKeys(89) = "Y"
	s_pszKeys(90) = "Z"
	s_pszKeys(91) = "Left Win"
	s_pszKeys(92) = "Right Win"
	s_pszKeys(93) = "App"
	s_pszKeys(94) = "Unknown"
	s_pszKeys(95) = "Sleep"
	s_pszKeys(96) = "Num 0"
	s_pszKeys(97) = "Num 1"
	s_pszKeys(98) = "Num 2"
	s_pszKeys(99) = "Num 3"
	s_pszKeys(100) = "Num 4"
	s_pszKeys(101) = "Num 5"
	s_pszKeys(102) = "Num 6"
	s_pszKeys(103) = "Num 7"
	s_pszKeys(104) = "Num 8"
	s_pszKeys(105) = "Num 9"
	s_pszKeys(106) = "Mul"
	s_pszKeys(107) = "Add"
	s_pszKeys(108) = "Separator"
	s_pszKeys(109) = "Sub"
	s_pszKeys(110) = "Decimal"
	s_pszKeys(111) = "Div"
	s_pszKeys(112) = "F1"
	s_pszKeys(113) = "F2"
	s_pszKeys(114) = "F3"
	s_pszKeys(115) = "F4"
	s_pszKeys(116) = "F5"
	s_pszKeys(117) = "F6"
	s_pszKeys(118) = "F7"
	s_pszKeys(119) = "F8"
	s_pszKeys(120) = "F9"
	s_pszKeys(121) = "F10"
	s_pszKeys(122) = "F11"
	s_pszKeys(123) = "F12"
	s_pszKeys(124) = "F13"
	s_pszKeys(125) = "F14"
	s_pszKeys(126) = "F15"
	s_pszKeys(127) = "F16"
	s_pszKeys(128) = "F17"
	s_pszKeys(129) = "F18"
	s_pszKeys(130) = "F19"
	s_pszKeys(131) = "F20"
	s_pszKeys(132) = "F21"
	s_pszKeys(133) = "F22"
	s_pszKeys(134) = "F23"
	s_pszKeys(135) = "F24"
	s_pszKeys(136) = "Unknown"
	s_pszKeys(137) = "Unknown"
	s_pszKeys(138) = "Unknown"
	s_pszKeys(139) = "Unknown"
	s_pszKeys(140) = "Unknown"
	s_pszKeys(141) = "Unknown"
	s_pszKeys(142) = "Unknown"
	s_pszKeys(143) = "Unknown"
	s_pszKeys(144) = "Num Lock"
	s_pszKeys(145) = "Scroll Lock"
	s_pszKeys(146) = "OEM"
	s_pszKeys(147) = "OEM"
	s_pszKeys(148) = "OEM"
	s_pszKeys(149) = "OEM"
	s_pszKeys(150) = "OEM"
	s_pszKeys(151) = "Unknown"
	s_pszKeys(152) = "Unknown"
	s_pszKeys(153) = "Unknown"
	s_pszKeys(154) = "Unknown"
	s_pszKeys(155) = "Unknown"
	s_pszKeys(156) = "Unknown"
	s_pszKeys(157) = "Unknown"
	s_pszKeys(158) = "Unknown"
	s_pszKeys(159) = "Unknown"
	s_pszKeys(160) = "Left Shift"
	s_pszKeys(161) = "Right Shift"
	s_pszKeys(162) = "Left Control"
	s_pszKeys(163) = "Right Control"
	s_pszKeys(164) = "Left Alt"
	s_pszKeys(165) = "Right Alt"
	s_pszKeys(166) = "Browser Back"
	s_pszKeys(167) = "Browser Forward"
	s_pszKeys(168) = "Browser Refresh"
	s_pszKeys(169) = "Browser Stop"
	s_pszKeys(170) = "Browser Search"
	s_pszKeys(171) = "Browser Favorites"
	s_pszKeys(172) = "Browser Home"
	s_pszKeys(173) = "Volume Mute"
	s_pszKeys(174) = "Volume Down"
	s_pszKeys(175) = "Volume Up"
	s_pszKeys(176) = "Next Track"
	s_pszKeys(177) = "Previous Track"
	s_pszKeys(178) = "Stop Media"
	s_pszKeys(179) = "Play/Pause Media"
	s_pszKeys(180) = "Start Mail"
	s_pszKeys(181) = "Select Media"
	s_pszKeys(182) = "Start App 1"
	s_pszKeys(183) = "Start App 2"
	s_pszKeys(184) = "Unknown"
	s_pszKeys(185) = "Unknown"
	s_pszKeys(186) = ";:"
	s_pszKeys(187) = "=+"
	s_pszKeys(188) = "<"
	s_pszKeys(189) = "-_"
	s_pszKeys(190) = ".>"
	s_pszKeys(191) = "/?"
	s_pszKeys(192) = "`~"
	s_pszKeys(193) = "Unknown"
	s_pszKeys(194) = "Unknown"
	s_pszKeys(195) = "Unknown"
	s_pszKeys(196) = "Unknown"
	s_pszKeys(197) = "Unknown"
	s_pszKeys(198) = "Unknown"
	s_pszKeys(199) = "Unknown"
	s_pszKeys(200) = "Unknown"
	s_pszKeys(201) = "Unknown"
	s_pszKeys(202) = "Unknown"
	s_pszKeys(203) = "Unknown"
	s_pszKeys(204) = "Unknown"
	s_pszKeys(205) = "Unknown"
	s_pszKeys(206) = "Unknown"
	s_pszKeys(207) = "Unknown"
	s_pszKeys(208) = "Unknown"
	s_pszKeys(209) = "Unknown"
	s_pszKeys(210) = "Unknown"
	s_pszKeys(211) = "Unknown"
	s_pszKeys(212) = "Unknown"
	s_pszKeys(213) = "Unknown"
	s_pszKeys(214) = "Unknown"
	s_pszKeys(215) = "Unknown"
	s_pszKeys(216) = "Unknown"
	s_pszKeys(217) = "Unknown"
	s_pszKeys(218) = "Unknown"
	s_pszKeys(219) = "[{"
	s_pszKeys(220) = "|"
	s_pszKeys(221) = "]}"
	s_pszKeys(222) = "'"+Chr(34)
	s_pszKeys(223) = "OEM"
	s_pszKeys(224) = "Unknown"
	s_pszKeys(225) = "OEM"
	s_pszKeys(226) = "<> or |"
	s_pszKeys(227) = "OEM"
	s_pszKeys(228) = "OEM"
	s_pszKeys(229) = "IME Process key"
	s_pszKeys(230) = "OEM"
	s_pszKeys(231) = "VK_PACKET"
	s_pszKeys(232) = "Unknown"
	s_pszKeys(233) = "OEM"
	s_pszKeys(234) = "OEM"
	s_pszKeys(235) = "OEM"
	s_pszKeys(236) = "OEM"
	s_pszKeys(237) = "OEM"
	s_pszKeys(238) = "OEM"
	s_pszKeys(239) = "OEM"
	s_pszKeys(240) = "OEM"
	s_pszKeys(241) = "OEM"
	s_pszKeys(242) = "OEM"
	s_pszKeys(243) = "OEM"
	s_pszKeys(244) = "OEM"
	s_pszKeys(245) = "OEM"
	s_pszKeys(246) = "Attn"
	s_pszKeys(247) = "CrSel"
	s_pszKeys(248) = "ExSel"
	s_pszKeys(249) = "Erase EOF"
	s_pszKeys(250) = "Play"
	s_pszKeys(251) = "Zoom"
	s_pszKeys(252) = "Unknown"
	s_pszKeys(253) = "PA1"
	s_pszKeys(254) = "Clear"
	s_pszKeys(255) = "Unknown"
	
  ProcedureReturn s_pszKeys(vkCode)
EndProcedure

Procedure.s HotkeyToString(vkCode, fModifiers)
  Protected pBuffer.s
  
	If (fModifiers & #MOD_WIN)
	  If Right(pBuffer, 1) = Chr(0)
		  pBuffer = Left(pBuffer, Len(pBuffer) - 1)
		EndIf
		
		pBuffer+"Win + "+Chr(0)
  EndIf
  
	If (fModifiers & #MOD_CONTROL)
	  If Right(pBuffer, 1) = Chr(0)
		  pBuffer = Left(pBuffer, Len(pBuffer) - 1)
		EndIf
		
	  pBuffer+"Ctrl + "+Chr(0)
  EndIf
		
	If (fModifiers & #MOD_ALT)
	  If Right(pBuffer, 1) = Chr(0)
		  pBuffer = Left(pBuffer, Len(pBuffer) - 1)
		EndIf
		
	  pBuffer+"Alt + "+Chr(0)
	EndIf
	
	If (fModifiers & #MOD_SHIFT)
	  If Right(pBuffer, 1) = Chr(0)
		  pBuffer = Left(pBuffer, Len(pBuffer) - 1)
		EndIf
		
	  pBuffer+"Shift + "+Chr(0)
	EndIf

	If vkCode
	  If Len(Hex(vkCode)) = 1
	    pszCode.s = "< "+GetKeyName(vkCode)+" (0x0"+Hex(vkCode)+") >"
	  Else
	    pszCode.s = "< "+GetKeyName(vkCode)+" (0x"+Hex(vkCode)+") >"
	  EndIf
	  
	  If Right(pBuffer, 1) = Chr(0)
		  pBuffer = Left(pBuffer, Len(pBuffer) - 1)
		EndIf
		
		pBuffer+pszCode+Chr(0)
	EndIf
	
	ProcedureReturn pBuffer
EndProcedure
HotKeyTest.pb

Code: Alles auswählen

XIncludeFile "WinHotkeyCtrl.pb"

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #String_0
  #String_1
  #Button_0
EndEnumeration

If OpenWindow(#Window_0, 0, 0, 250, 95, "WinHotkeyCtrl",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
  If CreateGadgetList(WindowID(#Window_0))
    StringGadget(#String_0, 5, 5, 240, 20, "")
    StringGadget(#String_1, 5, 30, 240, 20, "")
    ButtonGadget(#Button_0, 5, 70, 50, 20, "Exit")
      
    SetHotkeyControl(GadgetID(#String_0))
    SetHotkeyControl(GadgetID(#String_1))
  EndIf
EndIf
  
Repeat     
Until EventGadget() = #Button_0 Or WaitWindowEvent() = #PB_Event_CloseWindow

Debug GetHotkey(GadgetID(#String_0))
Debug GetHotkey(GadgetID(#String_1))
PureBasic 4.60 (Windows - x64)
tranquil
Beiträge: 117
Registriert: 22.09.2004 22:07
Kontaktdaten:

Beitrag von tranquil »

Super teilchen! Genau das was ich gesucht habe.

Gute Arbeit!!
Antworten