Page 1 of 1
Retrieve text from a Microsoft Hot Key control
Posted: Mon Oct 09, 2006 8:44 am
by netmaestro
I've been through everything I can find in the PSDK on this, and so far no luck. I can get the word containing the hotkey value with #HKM_GETHOTKEY, but what I want is the text in the window. It's sitting right there, it has to be retrievable. I've tried some #EM_ messages, GetWindowText_, looking for child windows, (doesn't seem to have any) but I'm coming up empty. Can anyone solve this one?

Posted: Mon Oct 09, 2006 8:49 am
by Trond
Is this cheating?
Code: Select all
Procedure.s KeyName(Key.b)
Ret.s
Select Key
Case #PB_Shortcut_Add
Ret = "Add"
Case #PB_Shortcut_Back
Ret = "Backspace"
Case #PB_Shortcut_Tab
Ret = "Tab"
Case #PB_Shortcut_Return
Ret = "Enter"
Case #PB_Shortcut_Menu
Ret = "Context menu"
Case #PB_Shortcut_Pause
Ret = "Pause"
Case #PB_Shortcut_Print
Ret = "Print Screen"
Case #PB_Shortcut_Capital
Ret = "Caps Lock"
Case #PB_Shortcut_Escape
Ret = "Escape"
Case #PB_Shortcut_Space
Ret = "Space"
Case #PB_Shortcut_Prior
Ret = "Page Up"
Case #PB_Shortcut_Next
Ret = "Page Down"
Case #PB_Shortcut_End
Ret = "End"
Case #PB_Shortcut_Home
Ret = "Home"
Case #PB_Shortcut_Left
Ret = "Left arrow"
Case #PB_Shortcut_Up
Ret = "Up arrow"
Case #PB_Shortcut_Right
Ret = "Right arrow"
Case #PB_Shortcut_Down
Ret = "Down arrow"
Case #PB_Shortcut_Select
Ret = "Select"
Case #PB_Shortcut_Insert
Ret = "Insert"
Case #PB_Shortcut_Delete
Ret = "Delete"
Default
If Key >= #PB_Shortcut_F1 And Key <= #PB_Shortcut_F24
Ret = "F" + Str(Key - #PB_Shortcut_F1 + 1)
Else
Ret = Chr(Key)
EndIf
EndSelect
ProcedureReturn Ret
EndProcedure
Procedure.l ShortcutHasCtrl(Sc.l)
If (Sc / #PB_Shortcut_Control) % 2
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
Procedure.l ShortcutHasAlt(Sc.l)
If Sc / #PB_Shortcut_Alt
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
Procedure.l ShortcutHasShift(Sc.l)
If (Sc / #PB_Shortcut_Shift) % 2
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
Procedure.s ShortcutName(Sc.l)
Name.s
If ShortcutHasCtrl(Sc)
Name + "Ctrl+"
EndIf
If ShortcutHasAlt(Sc)
Name + "Alt+"
EndIf
If ShortcutHasShift(Sc.l)
Name + "Shift+"
EndIf
Name + KeyName(Sc)
ProcedureReturn Name
EndProcedure
Posted: Mon Oct 09, 2006 8:55 am
by netmaestro
That's actually the kind of codeblock I'm desperately trying to avoid, and if I have to resort to it I may just give up and make people look in the control to see the value. The text is sitting right in that control, it just wouldn't make sense for there not to be some kind of message that'll get at it.
Posted: Mon Oct 09, 2006 2:17 pm
by Bonne_den_kule
Code: Select all
Procedure.s GetKeyName(ascii)
Define name$=Space(255) ; Prepare string to hold name of the desired key.
GetKeyNameText_(MapVirtualKey_(ascii,0)*$10000,name$,255) ; Get key name.
ProcedureReturn Trim(name$)
EndProcedure
Debug GetKeyName(#VK_TAB)
Posted: Mon Oct 09, 2006 6:27 pm
by netmaestro
Bonne_den_kule, that's an excellent solution. I'll be able to use it to accomplish my task nicely. I was trying to avoid writing a long, all-encompassing parsing routine that would inevitably have holes in it, but employing that will keep it nice and short and accurate. Thanks a million for posting, it's a day-saver!
Posted: Mon Oct 09, 2006 8:04 pm
by Flype
hello,
is it possible to retrieve extended keys name (on multimedia keyboard) such as 'web' key, 'mail' key, 'previous', 'next', ... ) ?
I tried the GetKeyName() procedures on those extended keys and it doesn't work.
Code: Select all
Procedure.s GetKeyName(ascii)
Protected name.s = Space(255)
GetKeyNameText_(MapVirtualKey_(ascii, 0) * $10000, name, 255)
ProcedureReturn Trim(name)
EndProcedure
Enumeration #VK_RMENU + 1 ; #VK pour Windows 2000/XP
#VK_BROWSER_BACK
#VK_BROWSER_FORWARD
#VK_BROWSER_REFRESH
#VK_BROWSER_STOP
#VK_BROWSER_SEARCH
#VK_BROWSER_FAVORITES
#VK_BROWSER_HOME
#VK_VOLUME_MUTE
#VK_VOLUME_DOWN
#VK_VOLUME_UP
#VK_MEDIA_NEXT_TRACK
#VK_MEDIA_PREV_TRACK
#VK_MEDIA_STOP
#VK_MEDIA_PLAY_PAUSE
#VK_LAUNCH_MAIL
#VK_LAUNCH_MEDIA_SELECT
#VK_LAUNCH_APP1
#VK_LAUNCH_APP2
EndEnumeration
If OpenWindow(0, 100, 100, 300, 200, "Multimedia", #PB_Window_SystemMenu)
Repeat
Select WaitWindowEvent()
Case #WM_CLOSE
Break
Case #WM_KEYDOWN
If EventlParam() & $1000000
Debug "Extended-key"
Select EventwParam()
Case #VK_BROWSER_BACK: Debug "#VK_BROWSER_BACK"
Case #VK_BROWSER_FORWARD: Debug "#VK_BROWSER_FORWARD"
Case #VK_BROWSER_REFRESH: Debug "#VK_BROWSER_REFRESH"
Case #VK_BROWSER_STOP: Debug "#VK_BROWSER_STOP"
Case #VK_BROWSER_SEARCH: Debug "#VK_BROWSER_SEARCH"
Case #VK_BROWSER_FAVORITES: Debug "#VK_BROWSER_FAVORITES"
Case #VK_BROWSER_HOME: Debug "#VK_BROWSER_HOME"
Case #VK_VOLUME_MUTE: Debug "#VK_VOLUME_MUTE"
Case #VK_VOLUME_DOWN: Debug "#VK_VOLUME_DOWN"
Case #VK_VOLUME_UP: Debug "#VK_VOLUME_UP"
Case #VK_MEDIA_NEXT_TRACK: Debug "#VK_MEDIA_NEXT_TRACK"
Case #VK_MEDIA_PREV_TRACK: Debug "#VK_MEDIA_PREV_TRACK"
Case #VK_MEDIA_STOP: Debug "#VK_MEDIA_STOP"
Case #VK_MEDIA_PLAY_PAUSE: Debug "#VK_MEDIA_PLAY_PAUSE"
Case #VK_LAUNCH_MAIL: Debug "#VK_LAUNCH_MAIL"
Case #VK_LAUNCH_MEDIA_SELECT: Debug "#VK_LAUNCH_MEDIA_SELECT"
Case #VK_LAUNCH_APP1: Debug "#VK_LAUNCH_APP1"
Case #VK_LAUNCH_APP2: Debug "#VK_LAUNCH_APP2"
EndSelect
Else
Debug "Standard-key: " + GetKeyName(EventwParam())
EndIf
EndSelect
ForEver
EndIf
Posted: Tue Oct 10, 2006 6:28 am
by KarLKoX
Code: Select all
Enumeration
#APPCOMMAND_BROWSER_BACKWARD = 1
#APPCOMMAND_BROWSER_FORWARD
#APPCOMMAND_BROWSER_REFRESH
#APPCOMMAND_BROWSER_STOP
#APPCOMMAND_BROWSER_SEARCH
#APPCOMMAND_BROWSER_FAVORITES
#APPCOMMAND_BROWSER_HOME
#APPCOMMAND_VOLUME_MUTE
#APPCOMMAND_VOLUME_DOWN
#APPCOMMAND_VOLUME_UP
#APPCOMMAND_MEDIA_NEXTTRACK
#APPCOMMAND_MEDIA_PREVIOUSTRACK
#APPCOMMAND_MEDIA_STOP
#APPCOMMAND_MEDIA_PLAY_PAUSE
#APPCOMMAND_LAUNCH_MAIL
#APPCOMMAND_LAUNCH_MEDIA_SELECT
#APPCOMMAND_LAUNCH_APP1
#APPCOMMAND_LAUNCH_APP2
#APPCOMMAND_BASS_DOWN
#APPCOMMAND_BASS_BOOST
#APPCOMMAND_BASS_UP
#APPCOMMAND_TREBLE_DOWN
#APPCOMMAND_TREBLE_UP
;#if(_WIN32_WINNT >= 0x0501)
#APPCOMMAND_MICROPHONE_VOLUME_MUTE
#APPCOMMAND_MICROPHONE_VOLUME_DOWN
#APPCOMMAND_MICROPHONE_VOLUME_UP
#APPCOMMAND_HELP
#APPCOMMAND_FIND
#APPCOMMAND_NEW
#APPCOMMAND_OPEN
#APPCOMMAND_CLOSE
#APPCOMMAND_SAVE
#APPCOMMAND_PRINT
#APPCOMMAND_UNDO
#APPCOMMAND_REDO
#APPCOMMAND_COPY
#APPCOMMAND_CUT
#APPCOMMAND_PASTE
#APPCOMMAND_REPLY_TO_MAIL
#APPCOMMAND_FORWARD_MAIL
#APPCOMMAND_SEND_MAIL
#APPCOMMAND_SPELL_CHECK
#APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE
#APPCOMMAND_MIC_ON_OFF_TOGGLE
#APPCOMMAND_CORRECTION_LIST
#APPCOMMAND_MEDIA_PLAY
#APPCOMMAND_MEDIA_PAUSE
#APPCOMMAND_MEDIA_RECORD
#APPCOMMAND_MEDIA_FAST_FORWARD
#APPCOMMAND_MEDIA_REWIND
#APPCOMMAND_MEDIA_CHANNEL_UP
#APPCOMMAND_MEDIA_CHANNEL_DOWN
EndEnumeration
Macro LOWORD(Value)
Value & $FFFF
EndMacro
Macro HIWORD(Value)
(Value >> 16) & $FFFF
EndMacro
#FAPPCOMMAND_MASK = $F000
Macro GET_APPCOMMAND_LPARAM(lParam)
HIWORD(lParam) & ~#FAPPCOMMAND_MASK
EndMacro
Procedure WndProc(WindowID, message, wParam, lParam)
Protected result.l, cmd.l
result = #PB_ProcessPureBasicEvents
If message = #WM_APPCOMMAND
cmd = GET_APPCOMMAND_LPARAM(lParam)
Debug "cmd = " + Str(cmd)
EndIf
ProcedureReturn Result
EndProcedure
If OpenWindow(0,0,0,320,240,"Multimedia Keyboard Extension")
SetWindowCallback(@WndProc())
Repeat : event = WaitWindowEvent() : Until event = #PB_Event_CloseWindow
EndIf