; ; ========================================================================================================== ; Author : LifeWeaver ; Script Name : JRiver Hotkeys ; Script Version : ; ; Creation Date : 11/17/2015 ; Modification Date : 12/22/2015 ; ; Description : Gui to configure JRiver's xml keyboard shortcuts file. ; =================== ; ; Disclaimer: this script is in no way affilated with JRiver, Inc. ; ---------------------------------------------------------------------------------------------------------- #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. #SingleInstance force SetBatchLines, -1 ; --------------------------------------------------- Constants -------------------------------------------- USER_DEFINED_KEYBOARD_SHORTCUTS_FILE := "C:\Program Files\J River\Media Center 16\Data\Custom Resources\Resource.xml" DEFAULT_KEYBOARD_SHORTCUTS_FILE := "C:\Program Files\J River\Media Center 16\Data\Default Resources\Resource.xml" COMMANDS_TEXT_SEPARATOR := "," ; see for more https://msdn.microsoft.com/en-us/library/ms753745%28v=vs.85%29.aspx NODE_ELEMENT := 1 ; --------------------------------------------------- Auto Execute ----------------------------------------- commandIndex := LoadCommands() mccCommands := InitMccCommandList(commandIndex) userShortcuts := LoadShortcutFile(USER_DEFINED_KEYBOARD_SHORTCUTS_FILE) defaultShortcuts := LoadShortcutFile(DEFAULT_KEYBOARD_SHORTCUTS_FILE) ; ------------------------------------------------------ Gui ------------------------------------------------ Gui, HotkeyConfig:New Gui, Font, s12 W1000 Gui, Add, GroupBox, x2 y10 w510 h220 , Assigned shortcuts Gui, Add, GroupBox, x2 y240 w510 h200 , Action Gui, Add, GroupBox, x2 y440 w510 h100 , Key Gui, Font Gui, Add, ListView, x12 y30 w490 h160 AltSubmit -Multi vAssignedShortcuts gUpdateKeyAndGlobal , Key|Modifiers|Global|Action|Parameter LV_ModifyCol(1, 60) LV_ModifyCol(2, 69) LV_ModifyCol(3, 50) LV_ModifyCol(4, 190) LV_ModifyCol(5, 100) Gui, Add, Button, x352 y200 w70 h20 gAddShortcut, Add Gui, Add, Button, x432 y200 w70 h20 gRemoveShortcut, Remove Gui, Add, Text, x12 y260 w60 h20 , Filter list by: Gui, Add, Edit, x82 y260 w420 h20 Disabled vfilter gActionSearch, Gui, Add, TreeView, x12 y290 w490 h110 Disabled vActionList gPossibleActionList Gui, Add, Text, x12 y410 w490 h20 , selected action description Gui, Add, Hotkey, x12 y470 w140 h20 Disabled vselectedHotkey gUpdateHotkeyInListView, Gui, Add, CheckBox, x352 y460 w100 h20 Disabled vglobalCheck gUpdateGlobalHotkeyBool , Global hotkey Gui, Add, Button, x352 y500 w70 h30 gButtonOK, OK Gui, Add, Button, x432 y500 w70 h30 gCancel , Cancel Gui, Add, Button, x12 y500 w70 h30 gResetToDefault , Reset to Default Gui, Add, Button, x92 y500 w70 h30 gResetPage , Reset page ; Generated using SmartGUI Creator 4.0 Menu, FileMenu, Add, Backup, MenuFileBackup Menu, FileMenu, Add, Import, MenuFileImport Menu, FileMenu, Add, E&xit, MenuHandler Menu, HelpMenu, Add, &About, MenuHandler Menu, MyMenuBar, Add, &File, :FileMenu Menu, MyMenuBar, Add, &Help, :HelpMenu Gui, Menu, MyMenuBar ResetView(userShortcuts) if(DisclaimerNotRead()) Disclaimer() Gui, Show, x255 y106 h551 w521, J. River Media Center Shortcut Configuration Return ; ---------------------------------------------------- Labels ----------------------------------------------- MenuFileBackup: FileSelectFile, userBackup, S8, A_Desktop\JRiverUserBackup.xml, Save your user defined backup:, (*.xml) FileCopy, %USER_DEFINED_KEYBOARD_SHORTCUTS_FILE%, %userBackup%, 1 return MenuFileImport: FileCopy, %USER_DEFINED_KEYBOARD_SHORTCUTS_FILE%, A_Desktop\JRiverUserBackup.xml, 1 MsgBox, 0, Import Note:, Shortcuts in the imported file take precedence if duplicate shortcuts exist. . A backup will be made of your shortcuts before the import: %A_Temp%\JRiverUserBackup.xml FileCopy, %USER_DEFINED_KEYBOARD_SHORTCUTS_FILE%, A_Temp\JRiverDefaultBackup.xml, 1 FileSelectFile, importFile, 3, %A_Desktop%, Select the file to import:, (*.xml) xml := ImportShortcuts(importFile) PopulateAssignedShortcutsListView(ParseShortcuts(xml)) return MenuHandler: if(A_ThisMenuItem = "E&xit") gosub, GuiClose else if(A_ThisMenuItem = "&About") DisplayAboutPopup() return ActionSearch: GuiControlGet, search,, filter AddMatchingActions(search) return AddShortcut: EnableForm() selectedCommandId := TV_GetSelection() ClearKeyAndGlobal() if(!selectedCommandId) rowNumber := LV_Add("", "", "", "no", "", "") else { TV_GetText(selectedAction, selectedCommandId) GuiControlGet, globalCheck,, globalCheck globalShortcut := globalCheck ? "yes" : "no" key := HotkeySelection() rowNumber := LV_Add("", key.key, key.modifiers, globalShortcut, selectedAction, "paramenter") } LV_Modify(rowNumber, "Select Vis") return RemoveShortcut: if(rowNumber := AssignedShortCutSelected()) { LV_Delete(rowNumber) xml := UpdateXml() } return ButtonOK: if(!IsObject(xml)) xml := UpdateXml() SaveXml(xml, USER_DEFINED_KEYBOARD_SHORTCUTS_FILE) gosub, HotkeyConfigGuiClose return PossibleActionList: if(rowNumber := AssignedShortCutSelected()) { selectedCommandId := TV_GetSelection() if(NotTypeOfCommand(selectedCommandId)) { TV_GetText(selectedAction, selectedCommandId) commandItem := mccCommands.item(selectedAction) param := commandItem.Param = "ignore" ? "" : commandItem.Param if(NonDefaultParamenter(commandItem.Type, param)) { param := NonDefaultParameterConfig(commandItem) } rowNumber := LV_Modify(rowNumber,"",,,, selectedAction, param) } } return ResetToDefault: Msgbox % "Backup of current shortcuts saved to: " ResetShortcutsToDefault() userShortcuts := DefaultUserShortcuts() ResetView(userShortcuts) return ResetPage: userShortcuts := LoadShortcutFile(USER_DEFINED_KEYBOARD_SHORTCUTS_FILE) ResetView(userShortcuts) return UpdateKeyAndGlobal: if(A_GuiEvent = "Normal") { if(rowNumber := AssignedShortCutSelected()) { EnableForm() UpdateHotkey(rowNumber) UpdateGlobalHotkey(rowNumber) } } return UpdateHotkeyInListView: if(rowNumber := AssignedShortCutSelected()) { key := HotkeySelection() LV_Modify(rowNumber,"Vis",key.Key,key.Modifiers) } return UpdateGlobalHotkeyBool: if(rowNumber := AssignedShortCutSelected()) { UpdateAssignedShortcutsGlobalHotkey(rowNumber) } return Cancel: HotkeyConfigGuiClose: GuiClose: ExitApp return ; ----------------------------------------------------- Methods ---------------------------------------------- LoadCommands() { global DEFAULT_KEYBOARD_SHORTCUTS_FILE xml := LoadXml(DEFAULT_KEYBOARD_SHORTCUTS_FILE) commands := Object() for node in xml.selectNodes("/MJRS/COMMANDS/Entry") { commands[node.getAttribute("Text")] := {command: node.getAttribute("Command"), text: node.getAttribute("Text")} if(node.getAttribute("Param")) commands[node.getAttribute("Text")]["param"] := node.getAttribute("Param") } return commands } LoadXml(file) { xml := ComObjCreate("MSXML2.DOMDocument.6.0") xml.async := false xml.Load(file) return xml } InitMccCommandList(commandIndex) { commands := Object() commands.Push({Command: "10000", Text: "MCC_PLAY_PAUSE", Param: "ignore"},{Command: "10001", Text: "MCC_PLAY", Param: "ignore"},{Command: "10002", Text: "MCC_STOP", Param: "bool bDisplayError"},{Command: "10003", Text: "MCC_NEXT", Param: "bool bNotActualNext"},{Command: "10004", Text: "MCC_PREVIOUS", Param: "ignore"},{Command: "10005", Text: "MCC_SHUFFLE", Param: "0: toggle shuffle mode; 1: shuffle, jump to PN; 2: shuffle, no jump; 3: off; 4: on; 5:automatic"}) commands.Push({Command: "10006", Text: "MCC_CONTINUOUS", Param: "0: toggle continuous; 1: off; 2: playlist; 3: song; 4: stop after each"},{Command: "10007", Text: "MCC_OBSOLETE_10007", Param: "ignore"},{Command: "10008", Text: "MCC_FAST_FORWARD", Param: "int nRate"},{Command: "10009", Text: "MCC_REWIND", Param: "int nRate"},{Command: "10010", Text: "MCC_STOP_CONDITIONAL", Param: "ignore"},{Command: "10011", Text: "MCC_SET_ZONE", Param: "int nZoneIndex (-1 toggles forward, -2 toggles backwards)"}) commands.Push({Command: "10012", Text: "MCC_TOGGLE_DISPLAY", Param: "bool bExcludeTheaterView"},{Command: "10013", Text: "MCC_SHOW_WINDOW", Param: "bool bJumpToPlayingNow"},{Command: "10014", Text: "MCC_MINIMIZE_WINDOW", Param: "ignore"},{Command: "10015", Text: "MCC_PLAY_CPLDB_INDEX", Param: "int nIndex"},{Command: "10016", Text: "MCC_SHOW_DSP_STUDIO", Param: "ignore"},{Command: "10017", Text: "MCC_VOLUME_MUTE", Param: "0: toggle; 1: mute; 2: unmute"}) commands.Push({Command: "10018", Text: "MCC_VOLUME_UP", Param: "int nDeltaPercent"},{Command: "10019", Text: "MCC_VOLUME_DOWN", Param: "int nDeltaPercent"},{Command: "10020", Text: "MCC_VOLUME_SET", Param: "int nPercent"},{Command: "10021", Text: "MCC_SHOW_PLAYBACK_OPTIONS", Param: "ignore"},{Command: "10022", Text: "MCC_SET_PAUSE", Param: "bool bPause (-1 toggles)"},{Command: "10023", Text: "MCC_SET_CURRENTLY_PLAYING_RATING", Param: "int nRating (1 through 5; 0 clears, but see here.)"}) commands.Push({Command: "10024", Text: "MCC_SHOW_PLAYBACK_ENGINE_MENU", Param: "screen point (loword: x, hiword: y) -- must send directly"},{Command: "10025", Text: "MCC_PLAY_NEXT_PLAYLIST", Param: "ignore"},{Command: "10026", Text: "MCC_PLAY_PREVIOUS_PLAYLIST", Param: "ignore"},{Command: "10027", Text: "MCC_MAXIMIZE_WINDOW", Param: "ignore"},{Command: "10028", Text: "MCC_RESTORE_WINDOW", Param: "ignore"},{Command: "10029", Text: "MCC_SET_PLAYERSTATUS", Param: "PLAYER_STATUS_CODES Code"}) commands.Push({Command: "10030", Text: "MCC_SET_ALTERNATE_PLAYBACK_SETTINGS", Param: "bool bAlternateSettings (-1 toggles)"},{Command: "10031", Text: "MCC_SET_PREVIEW_MODE_SETTINGS", Param: "low 12 bits: int nDurationSeconds, high 12 bits: int nStartSeconds"},{Command: "10032", Text: "MCC_SHOW_PLAYBACK_ENGINE_DISPLAY_PLUGIN_MENU", Param: "screen point (loword: x, hiword: y) -- must send directly"},{Command: "10033", Text: "MCC_DVD_MENU", Param: "ignore"}) commands.Push({Command: "10034", Text: "MCC_SEEK_FORWARD", Param: "int nMilliseconds (0 means default -- varies depending on playback type)"},{Command: "10035", Text: "MCC_SEEK_BACK", Param: "int nMilliseconds (0 means default -- varies depending on playback type)"},{Command: "10053", Text: "MCC_SET_AUDIO_STREAM", Param: "int nIndex (-1 toggles forward, -2 toggles backwards)"},{Command: "10059", Text: "MCC_SKIP_TO", Param: "SKIP_TO_MODES Mode"}) commands.Push({Command: "10036", Text: "MCC_STOP_AFTER_CURRENT_FILE", Param: "bool bStopAfterCurrentFile (-1 toggles)"},{Command: "10037", Text: "MCC_DETACH_DISPLAY", Param: "bool bDetach (-1 toggles)"},{Command: "10038", Text: "MCC_SET_MODE_ZONE_SPECIFIC", Param: "UI_MODES mode"},{Command: "10039", Text: "MCC_STOP_INTERNAL", Param: "ignore"},{Command: "10040", Text: "MCC_PLAYING_NOW_REMOVE_DUPLICATES", Param: "ignore"},{Command: "10041", Text: "MCC_SHUFFLE_REMAINING", Param: "ignore"}) commands.Push({Command: "10042", Text: "MCC_PLAY_FIRST_FILE", Param: "ignore"},{Command: "10043", Text: "MCC_PLAY_LAST_FILE", Param: "ignore"},{Command: "10044", Text: "MCC_PLAY_FILE_BY_STRING", Param: "BSTR bstrFile (deleted by receiver)"},{Command: "10045", Text: "MCC_PLAY_FILE_AGAIN", Param: "ignore"},{Command: "10046", Text: "MCC_HANDLE_PLAYBACK_ERROR", Param: "ignore"},{Command: "10047", Text: "MCC_PLAY_AUTOMATIC_PLAYLIST", Param: "BSTR bstrSeed (deleted by receiver)"}) commands.Push({Command: "10048", Text: "MCC_SEEK", Param: "int nPositionMilliseconds"},{Command: "10049", Text: "MCC_CLEAR_PLAYING_NOW_ZONE_SPECIFIC", Param: "0: all files; 1: leave playing file"},{Command: "10050", Text: "MCC_PLAY_RADIO_LAST_FM", Param: "ignore"},{Command: "10051", Text: "MCC_SHOW_ON_SCREEN_DISPLAY", Param: "0: position bar"},{Command: "10052", Text: "MCC_SET_SUBTITLES", Param: "int nIndex (-1 toggles forward, -2 toggles backwards)"}) commands.Push({Command: "10054", Text: "MCC_SET_VIDEO_STREAM", Param: "int nIndex (-1 toggles forward, -2 toggles backwards)"},{Command: "10055", Text: "MCC_VIDEO_SCREEN_GRAB", Param: "0: use as thumbnail; 1: save as external file"},{Command: "10056", Text: "MCC_SET_VOLUME_MODE", Param: "int nMode (internal type EPlaybackVolumeModes) (0: application, 1: internal; 2: system; 3: disabled)"},{Command: "10057", Text: "MCC_RESTART_PLAYBACK", Param: "ignore"}) commands.Push({Command: "10058", Text: "MCC_ZONE_SWITCH", Param: "ignore"},{Command: "20012", Text: "MCC_RESTORE_LIBRARY", Param: "ignore"},{Command: "21012", Text: "MCC_PROPERTIES", Param: "MEDIAFILE_INFO_ARRAY * paryFiles = NULL (-1 toggles) (note: never PostMessage(...) a pointer)"},{Command: "23000", Text: "MCC_IMPORT", Param: "int nFlags (1: bDisableAlreadyRunningWarning, 2: bFirstImportMode)"}) commands.Push({Command: "10060", Text: "MCC_LINK_ZONE", Param: "int nZoneID"},{Command: "10061", Text: "MCC_UNLINK_ZONE", Param: "ignore"},{Command: "10062", Text: "MCC_PLAY_RADIO_MEDIANET", Param: "ignore"},{Command: "10063", Text: "MCC_CLEAR_PLAYED_ZONE_SPECIFIC", Param: "ignore"},{Command: "10064", Text: "MCC_PLAY_LAST_TV_CHANNEL", Param: "ignore"},{Command: "20000", Text: "MCC_OPEN_FILE", Param: "ignore"}) commands.Push({Command: "20001", Text: "MCC_OPEN_URL", Param: "ignore"},{Command: "20002", Text: "MCC_PRINT_LIST", Param: "ignore"},{Command: "20003", Text: "MCC_EXPORT_PLAYLIST", Param: "int nPlaylistID (-1 for active view)"},{Command: "20004", Text: "MCC_EXPORT_ALL_PLAYLISTS", Param: "bool bSilent"},{Command: "20005", Text: "MCC_UPLOAD_FILES", Param: "ignore"},{Command: "20006", Text: "MCC_EMAIL_FILES", Param: "ignore"}) commands.Push({Command: "20007", Text: "MCC_EXIT", Param: "int nMode (0: normal, 1: force close (close media server), 2: force close (allow media server))"},{Command: "20008", Text: "MCC_UPDATE_LIBRARY", Param: "ignore"},{Command: "20009", Text: "MCC_CLEAR_LIBRARY", Param: "ignore"},{Command: "20010", Text: "MCC_EXPORT_LIBRARY", Param: "ignore"},{Command: "20011", Text: "MCC_BACKUP_LIBRARY", Param: "int nMode (0: normal, 1: silent automatic backup)"}) commands.Push({Command: "20013", Text: "MCC_LIBRARY_MANAGER", Param: "ignore"},{Command: "20014", Text: "MCC_IMAGE_ACQUIRE", Param: "ignore"},{Command: "20015", Text: "MCC_PRINT_IMAGES", Param: "MFKEY nKey (-1 for selected files)"},{Command: "20016", Text: "MCC_PRINT", Param: "ignore"},{Command: "20017", Text: "MCC_OBSOLETE_20017", Param: "ignore"},{Command: "20018", Text: "MCC_OBSOLETE_20018", Param: "ignore"}) commands.Push({Command: "20019", Text: "MCC_OBSOLETE_20019", Param: "ignore"},{Command: "20020", Text: "MCC_OBSOLETE_20020", Param: "ignore"},{Command: "20021", Text: "MCC_OBSOLETE_20021", Param: "ignore"},{Command: "20022", Text: "MCC_OBSOLETE_20022", Param: "ignore"},{Command: "20023", Text: "MCC_OBSOLETE_20023", Param: "ignore"},{Command: "20024", Text: "MCC_IMPORT_PLAYLIST", Param: "ignore"}) commands.Push({Command: "20025", Text: "MCC_LOAD_LIBRARY", Param: "int nLibraryIndex"},{Command: "20026", Text: "MCC_SYNC_LIBRARY", Param: "ignore"},{Command: "20027", Text: "MCC_EMAIL_PODCAST_FEED", Param: "ignore"},{Command: "20028", Text: "MCC_LOAD_LIBRARY_READ_ONLY", Param: "int nLibraryIndex"},{Command: "20029", Text: "MCC_ADD_LIBRARY", Param: "ignore"},{Command: "20030", Text: "MCC_EXPORT_ITUNES", Param: "ignore"}) commands.Push({Command: "20031", Text: "MCC_DISCONNECT_LIBRARY", Param: "ignore"},{Command: "20032", Text: "MCC_SYNC_WITH_LIBRARY_SERVER", Param: "ignore"},{Command: "20033", Text: "MCC_STOP_ALL_ZONES", Param: "bool bStopRemoteZones"},{Command: "20034", Text: "MCC_CLONE_LIBRARY", Param: "int nLibraryIndex"},{Command: "20035", Text: "MCC_OPEN_LIVE", Param: "ignore"},{Command: "21000", Text: "MCC_COPY", Param: "ignore"}) commands.Push({Command: "21001", Text: "MCC_PASTE", Param: "ignore"},{Command: "21002", Text: "MCC_SELECT_ALL", Param: "ignore"},{Command: "21003", Text: "MCC_SELECT_INVERT", Param: "ignore"},{Command: "21004", Text: "MCC_DELETE", Param: "bool bAggressive"},{Command: "21005", Text: "MCC_RENAME", Param: "ignore"},{Command: "21006", Text: "MCC_UNDO", Param: "ignore"}) commands.Push({Command: "21007", Text: "MCC_REDO", Param: "ignore"},{Command: "21008", Text: "MCC_QUICK_SEARCH", Param: "bool bRepeatLastSearch"},{Command: "21009", Text: "MCC_ADD_PLAYLIST", Param: "MEDIAFILE_INFO_ARRAY * paryFiles = NULL"},{Command: "21010", Text: "MCC_ADD_SMARTLIST", Param: "ignore"},{Command: "21011", Text: "MCC_ADD_PLAYLIST_GROUP", Param: "ignore"}) commands.Push({Command: "21013", Text: "MCC_TOGGLE_TAGGING_MODE", Param: "ignore"},{Command: "21014", Text: "MCC_CUT", Param: "ignore"},{Command: "21015", Text: "MCC_DESELECT_ALL", Param: "ignore"},{Command: "21016", Text: "MCC_DELETE_ALL", Param: "bool bAggressive"},{Command: "21017", Text: "MCC_ADD_PODCAST_FEED", Param: "ignore"},{Command: "21018", Text: "MCC_EDIT_PODCAST_FEED", Param: "ignore"}) commands.Push({Command: "21019", Text: "MCC_ADD_PODCAST_DEFAULTS", Param: "ignore"},{Command: "21020", Text: "MCC_CREATE_STOCK_SMARTLISTS", Param: "ignore"},{Command: "21021", Text: "MCC_ENABLE_PODCAST_DOWNLOAD", Param: "ignore"},{Command: "21022", Text: "MCC_DISABLE_PODCAST_DOWNLOAD", Param: "ignore"},{Command: "21023", Text: "MCC_EDIT_PLAYLIST", Param: "ignore"},{Command: "21024", Text: "MCC_EDIT_PLAYING_NOW", Param: "int nZoneID"}) commands.Push({Command: "21025", Text: "MCC_EDIT_DISC_INFORMATION", Param: "ignore"},{Command: "21026", Text: "MCC_EDIT_SMARTLIST", Param: "int nPlaylistID"},{Command: "21027", Text: "MCC_REFRESH_PODCAST_FEED", Param: "ignore"},{Command: "21028", Text: "MCC_LOOKUP_MOVIE_INFORMATION", Param: "ignore"},{Command: "21029", Text: "MCC_ADD_ZONE", Param: "ignore"},{Command: "21030", Text: "MCC_ADD_AUTOMATIC_PLAYLIST", Param: "ignore"}) commands.Push({Command: "21031", Text: "MCC_SET_WRITE_TAGS", Param: "bool bWriteTags (-1 toggles)"},{Command: "21032", Text: "MCC_PASTE_TAGS", Param: "ignore"},{Command: "21033", Text: "MCC_SHUFFLE_SELECTION", Param: "ignore"},{Command: "22000", Text: "MCC_TOGGLE_MODE", Param: "UI_MODES mode"},{Command: "22001", Text: "MCC_THEATER_VIEW", Param: "0: Toggle, 1: Home, 2: Playing Now, 3: Audio, 4: Images, 5: Video, 6: Playlists, 7: CD & DVD, 8: TV, 9: TV Guide, 10: TV Recordings"}) commands.Push({Command: "22003", Text: "MCC_SHOW_TREE_ROOT", Param: "-1: Toggle, 0: Hide, 1: Show"},{Command: "22004", Text: "MCC_FIND_MEDIA", Param: "wchar * pstrSearch (note: memory will be deleted by receiver)"},{Command: "22005", Text: "MCC_BACK", Param: "int nLevels (0 does 1 level)"},{Command: "22006", Text: "MCC_FORWARD", Param: "int nLevels (0 does 1 level)"},{Command: "22007", Text: "MCC_REFRESH", Param: "int nFlags (1: no webpage refresh)"}) commands.Push({Command: "22002", Text: "MCC_PARTY_MODE", Param: "ignore"},{Command: "22008", Text: "MCC_SET_LIST_STYLE", Param: "int nListStyle (-1 toggles)"},{Command: "22026", Text: "MCC_VIEW_ZOOM_INCREMENT", Param: "int nZoomDeltaPercentage"},{Command: "23018", Text: "MCC_HANDHELD_SHOW_OPTIONS", Param: "int nDeviceSessionID"}) commands.Push({Command: "22009", Text: "MCC_SET_MODE", Param: "UI_MODES mode"},{Command: "22010", Text: "MCC_OBSOLETE_22010", Param: "ignore"},{Command: "22011", Text: "MCC_OBSOLETE_22011", Param: "ignore"},{Command: "22012", Text: "MCC_SHOW_RECENTLYIMPORTED", Param: "ignore"},{Command: "22013", Text: "MCC_SHOW_TOPHITS", Param: "ignore"},{Command: "22014", Text: "MCC_SHOW_RECENTLYPLAYED", Param: "ignore"}) commands.Push({Command: "22015", Text: "MCC_SET_MEDIA_MODE", Param: "int nMediaMode"},{Command: "22016", Text: "MCC_OBSOLETE_22016", Param: "ignore"},{Command: "22017", Text: "MCC_SET_SERVER_MODE", Param: "bool bServerMode"},{Command: "22018", Text: "MCC_SET_MODE_FOR_EXTERNAL_PROGRAM_LAUNCH", Param: "int nType (0: starting external app, 1: ending external app)"},{Command: "22019", Text: "MCC_SET_MODE_FOR_SECOND_INSTANCE_LAUNCH", Param: "UI_MODES mode"},{Command: "22020", Text: "MCC_HOME", Param: "ignore"}) commands.Push({Command: "22021", Text: "MCC_ROLLUP_VIEW_HEADER", Param: "bool bRollup (-1: toggle)"},{Command: "22022", Text: "MCC_FOCUS_SEARCH_CONTROL", Param: "ignore"},{Command: "22023", Text: "MCC_SET_ACTIVE_VIEW_KEY", Param: "int nViewKey (-1: toggle, -2: toggle backwards, -3: new view)"},{Command: "22024", Text: "MCC_CLOSE_VIEW_KEY", Param: "int nViewKey (-1: current view)"},{Command: "22025", Text: "MCC_VIEW_ZOOM_SET", Param: "int nZoomPercentage"}) commands.Push({Command: "22027", Text: "MCC_FIND_MEDIA_WITH_WIZARD", Param: "ignore"},{Command: "22028", Text: "MCC_SET_USER", Param: "int nUserId"},{Command: "22029", Text: "MCC_SHOW_TREE", Param: "bool bShowTree (-1 toggles)"},{Command: "22030", Text: "MCC_SET_TOOLTIPS", Param: "bool bTooltips (-1 toggles)"},{Command: "22031", Text: "MCC_AUDIO_ONLY_MODE", Param: "bool bAudioOnlyMode (-1 toggles)"}) commands.Push({Command: "23001", Text: "MCC_RIP_CD", Param: "ignore"},{Command: "23002", Text: "MCC_BURN", Param: "ignore"},{Command: "23003", Text: "MCC_RECORD_AUDIO", Param: "ignore"},{Command: "23004", Text: "MCC_CONVERT", Param: "ignore"},{Command: "23005", Text: "MCC_ANALYZE_AUDIO", Param: "ignore"},{Command: "23006", Text: "MCC_MEDIA_EDITOR", Param: "ignore"}) commands.Push({Command: "23007", Text: "MCC_CD_LABELER", Param: "ignore"},{Command: "23008", Text: "MCC_OBSOLETE_23008", Param: "ignore"},{Command: "23009", Text: "MCC_OBSOLETE_23009", Param: "ignore"},{Command: "23010", Text: "MCC_SKIN_MANAGER", Param: "ignore"},{Command: "23011", Text: "MCC_OPTIONS", Param: "int nPageID"},{Command: "23012", Text: "MCC_RENAME_CD_FILES", Param: "ignore"}) commands.Push({Command: "23013", Text: "MCC_OBSOLETE_23013", Param: "ignore"},{Command: "23014", Text: "MCC_OBSOLETE_23014", Param: "ignore"},{Command: "23015", Text: "MCC_HANDHELD_UPLOAD", Param: "loword: nDeviceSessionID (0 gets default), hiword: flags (1: sync only; 2: show warnings)"},{Command: "23016", Text: "MCC_HANDHELD_UPDATE_UPLOAD_WORKER_FINISHED", Param: "int nDeviceSessionID"},{Command: "23017", Text: "MCC_HANDHELD_CLOSE_DEVICE", Param: "int nDeviceSessionID"}) commands.Push({Command: "23019", Text: "MCC_HANDHELD_INFO_DUMP", Param: "bool bShowInfo"},{Command: "23020", Text: "MCC_IMPORT_AUTO_RUN_NOW", Param: "bool bSilent"},{Command: "23021", Text: "MCC_IMPORT_AUTO_CONFIGURE", Param: "ignore"},{Command: "23022", Text: "MCC_HANDHELD_EJECT", Param: "int nDeviceSessionID"},{Command: "23023", Text: "MCC_RECORD_TV", Param: "ignore"},{Command: "23024", Text: "MCC_FIND_AND_REPLACE", Param: "ignore"}) commands.Push({Command: "23025", Text: "MCC_CLEAN_PROPERTIES", Param: "ignore"},{Command: "23026", Text: "MCC_FILL_TRACK_ORDER", Param: "ignore"},{Command: "23027", Text: "MCC_MOVE_COPY_FIELDS", Param: "ignore"},{Command: "23028", Text: "MCC_REMOVE_TAGS", Param: "ignore"},{Command: "23029", Text: "MCC_UPDATE_TAGS_FROM_DB", Param: "ignore"},{Command: "23030", Text: "MCC_UPDATE_DB_FROM_TAGS", Param: "ignore"}) commands.Push({Command: "23031", Text: "MCC_LOOKUP_TRACK_INFO_FROM_INTERNET", Param: "ignore"},{Command: "23032", Text: "MCC_SUBMIT_TRACK_INFO_TO_INTERNET", Param: "ignore"},{Command: "23033", Text: "MCC_OBSOLETE_23033", Param: "ignore"},{Command: "23034", Text: "MCC_FILL_PROPERTIES_FROM_FILENAME", Param: "ignore"},{Command: "23035", Text: "MCC_RENAME_FILES_FROM_PROPERTIES", Param: "ignore"},{Command: "23036", Text: "MCC_COVER_ART_ADD_FROM_FILE", Param: "ignore"}) commands.Push({Command: "23037", Text: "MCC_COVER_ART_QUICK_ADD_FROM_FILE", Param: "ignore"},{Command: "23038", Text: "MCC_COVER_ART_GET_FROM_INTERNET", Param: "ignore"},{Command: "23039", Text: "MCC_COVER_ART_SUBMIT_TO_INTERNET", Param: "ignore"},{Command: "23040", Text: "MCC_COVER_ART_GET_FROM_SCANNER", Param: "ignore"},{Command: "23041", Text: "MCC_COVER_ART_SELECT_SCANNER", Param: "ignore"},{Command: "23042", Text: "MCC_COVER_ART_GET_FROM_CLIPBOARD", Param: "ignore"}) commands.Push({Command: "23043", Text: "MCC_COVER_ART_COPY_TO_CLIPBOARD", Param: "ignore"},{Command: "23044", Text: "MCC_COVER_ART_REMOVE", Param: "ignore"},{Command: "23045", Text: "MCC_COVER_ART_PLAY", Param: "ignore"},{Command: "23046", Text: "MCC_COVER_ART_SAVE_TO_EXTERNAL_FILE", Param: "ignore"},{Command: "23047", Text: "MCC_COVER_ART_REBUILD_THUMBNAIL", Param: "ignore"},{Command: "23048", Text: "MCC_RINGTONE", Param: "ignore"}) commands.Push({Command: "23049", Text: "MCC_AUDIO_CALIBRATION", Param: "ignore"},{Command: "23050", Text: "MCC_MARK_PLAYED", Param: "ignore"},{Command: "23051", Text: "MCC_MARK_NOT_PLAYED", Param: "ignore"},{Command: "23052", Text: "MCC_LINK_TRACKS", Param: "ignore"},{Command: "23053", Text: "MCC_BREAK_TRACK_LINKS", Param: "ignore"},{Command: "24000", Text: "MCC_HELP_CONTENTS", Param: "ignore"}) commands.Push({Command: "24001", Text: "MCC_HELP_HOWTO_IMPORT_FILES", Param: "ignore"},{Command: "24002", Text: "MCC_HELP_HOWTO_PLAY_FILES", Param: "ignore"},{Command: "24003", Text: "MCC_HELP_HOWTO_RIP", Param: "ignore"},{Command: "24004", Text: "MCC_HELP_HOWTO_BURN", Param: "ignore"},{Command: "24005", Text: "MCC_HELP_HOWTO_ORGANIZE_FILES", Param: "ignore"},{Command: "24006", Text: "MCC_HELP_HOWTO_VIEW_SCHEMES", Param: "ignore"}) commands.Push({Command: "24007", Text: "MCC_HELP_HOWTO_MANAGE_PLAYLISTS", Param: "ignore"},{Command: "24008", Text: "MCC_HELP_HOWTO_EDIT_PROPERTIES", Param: "ignore"},{Command: "24009", Text: "MCC_HELP_HOWTO_FIND", Param: "ignore"},{Command: "24010", Text: "MCC_HELP_HOWTO_CONFIGURE", Param: "ignore"},{Command: "24011", Text: "MCC_CHECK_FOR_UPDATES", Param: "ignore"},{Command: "24012", Text: "MCC_BUY", Param: "ignore"}) commands.Push({Command: "24013", Text: "MCC_INSTALL_LICENSE", Param: "ignore"},{Command: "24014", Text: "MCC_REGISTRATION_INFO", Param: "ignore"},{Command: "24015", Text: "MCC_PLUS_FEATURES", Param: "ignore"},{Command: "24016", Text: "MCC_INTERACT", Param: "ignore"},{Command: "24017", Text: "MCC_SYSTEM_INFO", Param: "ignore"},{Command: "24018", Text: "MCC_ABOUT", Param: "ignore"}) commands.Push({Command: "24019", Text: "MCC_CONFIGURE_DEBUG_LOGGING", Param: "ignore"},{Command: "24020", Text: "MCC_WIKI", Param: "ignore"},{Command: "24021", Text: "MCC_TEST", Param: "ignore"},{Command: "24022", Text: "MCC_SHOW_EULA", Param: "ignore"},{Command: "24023", Text: "MCC_BENCHMARK", Param: "ignore"},{Command: "24024", Text: "MCC_UPGRADE_TO_MASTER_LICENSE", Param: "ignore"}) commands.Push({Command: "25000", Text: "MCC_ADD_VIEW_SCHEME", Param: "ignore"},{Command: "25001", Text: "MCC_EDIT_VIEW_SCHEME", Param: "ignore"},{Command: "25002", Text: "MCC_OBSOLETE_25002", Param: "ignore"},{Command: "25003", Text: "MCC_OBSOLETE_25003", Param: "ignore"},{Command: "25004", Text: "MCC_OBSOLETE_25004", Param: "ignore"},{Command: "25005", Text: "MCC_OBSOLETE_25005", Param: "ignore"}) commands.Push({Command: "25006", Text: "MCC_OBSOLETE_25006", Param: "ignore"},{Command: "25007", Text: "MCC_OBSOLETE_25007", Param: "ignore"},{Command: "25008", Text: "MCC_TREE_ADD_DIRECTORY", Param: "ignore"},{Command: "25009", Text: "MCC_TREE_IMPORT", Param: "ignore"},{Command: "25010", Text: "MCC_TREE_ADD_CD_FOLDER", Param: "ignore"},{Command: "25011", Text: "MCC_UPDATE_FROM_CD_DATABASE", Param: "ignore"}) commands.Push({Command: "25012", Text: "MCC_SUBMIT_TO_CD_DATABASE", Param: "ignore"},{Command: "25013", Text: "MCC_TREE_RIP", Param: "ignore"},{Command: "25014", Text: "MCC_CLEAR_PLAYING_NOW", Param: "0: all files; 1: leave playing file"},{Command: "25015", Text: "MCC_COPY_LISTENING_TO", Param: "bool bPaste"},{Command: "25016", Text: "MCC_TREE_SET_EXPANDED", Param: "0: collapsed; 1: expanded"},{Command: "25017", Text: "MCC_RESET_VIEW_SCHEMES", Param: "ignore"}) commands.Push({Command: "25018", Text: "MCC_TREE_ERASE_CD_DVD", Param: "ignore"},{Command: "25019", Text: "MCC_UPDATE_FROM_CDPLAYER_INI", Param: "ignore"},{Command: "25020", Text: "MCC_TREE_EJECT", Param: "ignore"},{Command: "25021", Text: "MCC_TREE_ADD_VIRTUAL_DEVICE", Param: "ignore"},{Command: "25022", Text: "MCC_TREE_RENAME_PLAYLIST", Param: "int nPlaylistID"},{Command: "25023", Text: "MCC_TWITTER_LISTENING_TO", Param: "ignore"}) commands.Push({Command: "25024", Text: "MCC_SCROBBLE_LISTENING_TO", Param: "ignore"},{Command: "26000", Text: "MCC_LIST_UPDATE_ORDER", Param: "ignore"},{Command: "26001", Text: "MCC_LIST_SHUFFLE_ORDER", Param: "ignore"},{Command: "26002", Text: "MCC_LIST_IMPORT", Param: "ignore"},{Command: "26003", Text: "MCC_LIST_REMOVE_ORDER", Param: "ignore"},{Command: "26004", Text: "MCC_LOCATE_FILE", Param: "int nLocation (-1: on disk (internal); -2: on disk (external); 0-n: library field index)"}) commands.Push({Command: "26005", Text: "MCC_LIST_OBSOLETE_26005", Param: "ignore"},{Command: "26006", Text: "MCC_LIST_INCREMENT_SELECTION", Param: "int nDelta"},{Command: "26007", Text: "MCC_LIST_REMOVE_DUPLICATES", Param: "ignore"},{Command: "26008", Text: "MCC_LIST_AUTO_SIZE_COLUMN", Param: "int nColumn, zero-based column index (-1: all)"},{Command: "26009", Text: "MCC_LIST_CUSTOMIZE_VIEW", Param: "ignore"},{Command: "26010", Text: "MCC_LIST_COPY_DISK_FILES", Param: "ignore"}) commands.Push({Command: "26011", Text: "MCC_LIST_SET_RIP_CHECK", Param: "0: uncheck, 1: check, -1: toggle"},{Command: "26012", Text: "MCC_LIST_DOWNLOAD", Param: "ignore"},{Command: "26013", Text: "MCC_LIST_GET_LIST_POINTER", Param: "ignore"},{Command: "26014", Text: "MCC_LOCATE_STACK", Param: "ignore"},{Command: "26015", Text: "MCC_SET_AS_STACK_TOP", Param: "ignore"},{Command: "26016", Text: "MCC_EXPAND_STACK", Param: "ignore"}) commands.Push({Command: "26017", Text: "MCC_COLLAPSE_STACK", Param: "ignore"},{Command: "26018", Text: "MCC_AUTOSTACK", Param: "0: by name, 1: artist, album, name, 2: Artist, Album, Track # and Name"},{Command: "26019", Text: "MCC_CHECK_STACKS", Param: "ignore"},{Command: "26020", Text: "MCC_STACK", Param: "int nZeroBasedSelection"},{Command: "26021", Text: "MCC_UNSTACK", Param: "ignore"},{Command: "26022", Text: "MCC_ADD_TO_STACK", Param: "ignore"}) commands.Push({Command: "26023", Text: "MCC_PANE_RESET_SELECTION", Param: "int nPaneIndex (-1 resets all)"},{Command: "26024", Text: "MCC_LIST_REMOVE_ALL", Param: "ignore"},{Command: "26025", Text: "MCC_LIST_LOCK", Param: "bool bLock (-1 toggles)"},{Command: "26026", Text: "MCC_PANE_SET_EXPANDED", Param: "loword: nPaneIndex, hiword: 0: collapsed; 1: expanded"},{Command: "27000", Text: "MCC_KEYSTROKE", Param: "int nKeyCode"}) commands.Push({Command: "27001", Text: "MCC_SHUTDOWN", Param: "int nMode (0: shutdown; 1: sleep; 2: hibernate; 3: restart) (based on CSystemShutdown::EShutdownModes)"},{Command: "28022", Text: "MCC_PLAYBACK_ENGINE_SET_ASPECT_RATIO", Param: "-1: cycles; 0 - 8: selects individual Aspect Ratio Modes"}) commands.Push({Command: "28000", Text: "MCC_PLAYBACK_ENGINE_ZOOM_IN", Param: "ignore"},{Command: "28001", Text: "MCC_PLAYBACK_ENGINE_ZOOM_OUT", Param: "ignore"},{Command: "28002", Text: "MCC_PLAYBACK_ENGINE_UP", Param: "ignore"},{Command: "28003", Text: "MCC_PLAYBACK_ENGINE_DOWN", Param: "ignore"},{Command: "28004", Text: "MCC_PLAYBACK_ENGINE_LEFT", Param: "ignore"},{Command: "28005", Text: "MCC_PLAYBACK_ENGINE_RIGHT", Param: "ignore"}) commands.Push({Command: "28006", Text: "MCC_PLAYBACK_ENGINE_ENTER", Param: "ignore"},{Command: "28007", Text: "MCC_PLAYBACK_ENGINE_FIRST", Param: "ignore"},{Command: "28008", Text: "MCC_PLAYBACK_ENGINE_LAST", Param: "ignore"},{Command: "28009", Text: "MCC_PLAYBACK_ENGINE_NEXT", Param: "ignore"},{Command: "28010", Text: "MCC_PLAYBACK_ENGINE_PREVIOUS", Param: "ignore"},{Command: "28011", Text: "MCC_PLAYBACK_ENGINE_PAUSE", Param: "bool bPause (-1 toggles)"}) commands.Push({Command: "28012", Text: "MCC_IMAGE_PAN_AND_ZOOM", Param: "bool bPanAndZoom (-1 toggles)"},{Command: "28013", Text: "MCC_IMAGE_TOGGLE_EFFECT", Param: "int nDelta"},{Command: "28014", Text: "MCC_IMAGE_RAPID_ZOOM", Param: "int nRapidZoom"},{Command: "28015", Text: "MCC_DVD_SET_AUDIO_STREAM", Param: "int nAudioStream (-1 toggles)"},{Command: "28016", Text: "MCC_DVD_SHOW_MENU", Param: "ignore"},{Command: "28017", Text: "MCC_TV_RECORD", Param: "ignore"}) commands.Push({Command: "28018", Text: "MCC_TV_SNAPSHOT", Param: "ignore"},{Command: "28019", Text: "MCC_TV_CHANGE_STANDARD", Param: "ignore"},{Command: "28020", Text: "MCC_PLAYBACK_ENGINE_OSD_VIDEO_PROC_AMP", Param: "int nIndex (0 for brightness, 1 for contrast, etc. -1 cycles)"},{Command: "28021", Text: "MCC_PLAYBACK_ENGINE_SET_CUR_VIDEO_PROC_AMP", Param: "int nStep (... -2, -1, 1, 2, etc. 0 is invalid and will default to 1)"}) commands.Push({Command: "28023", Text: "MCC_PLAYBACK_ENGINE_SCROLL_UP", Param: "ignore"},{Command: "28029", Text: "MCC_TV_SCAN_PROGRAMMING_EVENTS", Param: "ignored"},{Command: "28034", Text: "MCC_PLAYBACK_ENGINE_SET_VIDEO_STREAM", Param: "int nIndex (-1 toggles forward, -2 toggles backwards)"},{Command: "28035", Text: "MCC_PLAYBACK_ENGINE_VIDEO_SCREEN_GRAB", Param: "0: use as thumbnail; 1: save as external file"}) commands.Push({Command: "28024", Text: "MCC_PLAYBACK_ENGINE_SCROLL_DOWN", Param: "ignore"},{Command: "28025", Text: "MCC_PLAYBACK_ENGINE_SCROLL_LEFT", Param: "ignore"},{Command: "28026", Text: "MCC_PLAYBACK_ENGINE_SCROLL_RIGHT", Param: "ignore"},{Command: "28027", Text: "MCC_TV_SET_SAVE_TIME_SHIFTING", Param: "int nSaveMode (0 - 6, -1 cycles by incrementing, -2 cycles by decrementing)"},{Command: "28028", Text: "MCC_PLAYBACK_ENGINE_ZOOM_TO_PRESET", Param: "int 0 to fit window, 1 for 100%, 2 for 200%"}) commands.Push({Command: "28030", Text: "MCC_TV_CHANGE_CHANNEL_KEY", Param: "int nKey"},{Command: "28031", Text: "MCC_TV_PLAY_CHANNEL_POSITION", Param: "int Playlist position"},{Command: "28032", Text: "MCC_PLAYBACK_ENGINE_SET_SUBTITLES", Param: "int nIndex (-1 toggles forward, -2 toggles backwards)"},{Command: "28033", Text: "MCC_PLAYBACK_ENGINE_SET_AUDIO_STREAM", Param: "int nIndex (-1 toggles forward, -2 toggles backwards)"}) commands.Push({Command: "28036", Text: "MCC_PLAYBACK_ENGINE_VIDEO_LIPSYNC", Param: "int nShiftMS"},{Command: "28037", Text: "MCC_PLAYBACK_ENGINE_SET_SUBTITLE_TIMING", Param: "int nChangeMS"},{Command: "30000", Text: "MCC_RELOAD_MC_VIEW", Param: "ignore"},{Command: "30001", Text: "MCC_CUSTOMIZE_TOOLBAR", Param: "ignore"},{Command: "30002", Text: "MCC_PLAY_TV", Param: "int nChannelNumber, user assigned channel number"},{Command: "30003", Text: "MCC_UPDATE_WEBPAGES", Param: "ignore"}) commands.Push({Command: "30004", Text: "MCC_SHOW_RUNNING_MC", Param: "bool bToggleVisibility"},{Command: "30005", Text: "MCC_SHOW_MENU", Param: "int nMenuID"},{Command: "30006", Text: "MCC_TUNE_TV", Param: "ignore"},{Command: "30007", Text: "MCC_PLAY_PLAYLIST", Param: "int nPlaylistID"},{Command: "30008", Text: "MCC_SENDTO_TOOL", Param: "0: labeler; 1: media editor; 2: default editor; 3: ftp upload; 4: email; 5 Menalto Gallery; 6 Web Gallery"}) commands.Push({Command: "30009", Text: "MCC_SHOW_VIEW_INFO", Param: "new CMCViewInfo * (for internal use only)"},{Command: "30015", Text: "MCC_REENUM_PORTABLE_DEVICES", Param: "bool bDeviceConnected"},{Command: "31003", Text: "MCC_IMAGE_ROTATE_UPSIDEDOWN", Param: "ignore"},{Command: "33004", Text: "MCC_SELECT_FILES", Param: "CMediaArray *"},{Command: "34015", Text: "MCC_NOTIFY_GET_TAB_HWNDS", Param: "ignore"}) commands.Push({Command: "30010", Text: "MCC_OBSOLETE_30010", Param: "ignore"},{Command: "30011", Text: "MCC_DEVICE_CHANGED", Param: "new DEVICE_CHANGE_INFO * (for internal use only)"},{Command: "30012", Text: "MCC_CONFIGURE_THEATER_VIEW", Param: "ignore"},{Command: "30013", Text: "MCC_SET_STATUSTEXT", Param: "BSTR bstrText (deleted by receiver)"},{Command: "30014", Text: "MCC_UPDATE_UI_AFTER_ACTIVE_WINDOW_CHANGE", Param: "ignore"}) commands.Push({Command: "30016", Text: "MCC_PLAY_ADVANCED", Param: "PLAY_COMMAND * pCommand (deleted by receiver)"},{Command: "30017", Text: "MCC_UPDATE_STATUS_BAR", Param: "ignore"},{Command: "30018", Text: "MCC_REQUEST_PODCAST_UPDATE", Param: "ignore"},{Command: "30019", Text: "MCC_REQUEST_PODCAST_PURGE", Param: "ignore"},{Command: "30020", Text: "MCC_OBSOLETE_30020", Param: "ignore"},{Command: "30021", Text: "MCC_SHOW_INVALID_CD_VOLUME_WARNING", Param: "TCHAR cDriveLetter"}) commands.Push({Command: "30022", Text: "MCC_PLAY_TV_CHANNEL_FOR_CLIENT", Param: "the MFKEY key of the TV channel to be played"},{Command: "30023", Text: "MCC_STOP_SERVING_TV_FILE", Param: "CTVPlayer *: pointer to TVPlayer object serving the file"},{Command: "31000", Text: "MCC_IMAGE_SET_DESKTOP_BACK", Param: "ignore"},{Command: "31001", Text: "MCC_IMAGE_ROTATE_LEFT", Param: "ignore"},{Command: "31002", Text: "MCC_IMAGE_ROTATE_RIGHT", Param: "ignore"}) commands.Push({Command: "31004", Text: "MCC_IMAGE_RESIZE", Param: "ignore"},{Command: "31005", Text: "MCC_IMAGE_EDIT", Param: "int nFileKey"},{Command: "31006", Text: "MCC_IMAGE_DELETE", Param: "int nFileKey"},{Command: "31007", Text: "MCC_IMAGE_PREVIEW_SHOW", Param: "ignore"},{Command: "31008", Text: "MCC_IMAGE_PREVIEW_HIDE", Param: "ignore"},{Command: "31009", Text: "MCC_IMAGE_LOCATE_ON_MAP", Param: "ignore"}) commands.Push({Command: "32000", Text: "MCC_QUERY_UI_MODE", Param: "bool bInternalMode; Exit status is current UI_MODES"},{Command: "33000", Text: "MCC_GET_SELECTED_FILES", Param: "loword: GET_SELECTION_MODES Mode, hiword: short nFlags (1: for playback)"},{Command: "33001", Text: "MCC_PRINTVIEW", Param: "ignore"},{Command: "33002", Text: "MCC_OUTPUT", Param: "int nPlaylistID (-1 for active view)"},{Command: "33003", Text: "MCC_SETFOCUS", Param: "ignore"}) commands.Push({Command: "33005", Text: "MCC_DOUBLE_CLICK", Param: "ignore"},{Command: "33006", Text: "MCC_PLAY_OR_SHOW", Param: "ignore"},{Command: "33007", Text: "MCC_SHOW_CURRENT_FILE", Param: "int nFlags (1: force, 2: select)"},{Command: "33008", Text: "MCC_BUY_SELECTED_TRACKS", Param: "int nPurchaseFlags"},{Command: "33009", Text: "MCC_BUY_ALL_TRACKS", Param: "int nPurchaseFlags"},{Command: "33010", Text: "MCC_BUY_ALBUM", Param: "int nPurchaseFlags"}) commands.Push({Command: "33011", Text: "MCC_UPDATE_AFTER_PLUGIN_INSTALLED", Param: "ignore"},{Command: "33012", Text: "MCC_UPDATE_AFTER_SKIN_INSTALLED", Param: "bool bMiniView"},{Command: "34000", Text: "MCC_NOTIFY_FONT_CHANGED", Param: "ignore"},{Command: "34001", Text: "MCC_NOTIFY_VIEW_CHANGED", Param: "ignore"},{Command: "34002", Text: "MCC_NOTIFY_BEFORE_ACTIVE_VIEW_CHANGED", Param: "ignore"},{Command: "34003", Text: "MCC_NOTIFY_ACTIVE_VIEW_CHANGED", Param: "ignore"}) commands.Push({Command: "34004", Text: "MCC_NOTIFY_PLAYER_INFO_CHANGED", Param: "PLAYER_INFO_CHANGES nChange"},{Command: "34005", Text: "MCC_NOTIFY_TOOLTIPS_CHANGED", Param: "bool bEnabled"},{Command: "34006", Text: "MCC_NOTIFY_OPTIONS_CHANGED", Param: "ignore"},{Command: "34007", Text: "MCC_UPDATE", Param: "int nFlags"},{Command: "34008", Text: "MCC_NOTIFY_FOCUS_CHANGED", Param: "ignore"},{Command: "34009", Text: "MCC_SAVE_PROPERTIES", Param: "ignore"}) commands.Push({Command: "34010", Text: "MCC_NOTIFY_UI_MODE_CHANGED", Param: "UI_MODES NewMode"},{Command: "34011", Text: "MCC_NOTIFY_SELECTION_CHANGED", Param: "int nViewKey"},{Command: "34012", Text: "MCC_NOTIFY_FILE_CHANGED", Param: "int nFileKey (-1: invalidates all files)"},{Command: "34013", Text: "MCC_NOTIFY_FILE_STATUS_CHANGED", Param: "int nFileKey (-1: invalidates all files)"},{Command: "34014", Text: "MCC_NOTIFY_FILE_ENSURE_VISIBLE", Param: "int nFileKey"}) commands.Push({Command: "34016", Text: "MCC_NOTIFY_BURNER_QUEUE_CHANGED", Param: "int nFlags (1: folder change)"},{Command: "34017", Text: "MCC_NOTIFY_BURNER_PROGRESS_CHANGED", Param: "int nPercentage"},{Command: "34018", Text: "MCC_NOTIFY_BURNER_STATUS_CHANGED", Param: "ignore"},{Command: "34019", Text: "MCC_NOTIFY_BURNER_STARTED", Param: "ignore"},{Command: "34020", Text: "MCC_NOTIFY_BURNER_FINISHED_INTERNAL", Param: "ignore"},{Command: "34021", Text: "MCC_NOTIFY_BURNER_FINISHED", Param: "ignore"}) commands.Push({Command: "34022", Text: "MCC_NOTIFY_BURNER_FAILED_INTERNAL", Param: "ignore"},{Command: "34023", Text: "MCC_NOTIFY_BURNER_FAILED", Param: "ignore"},{Command: "34024", Text: "MCC_NOTIFY_BURNER_CLOSE_UI", Param: "ignore"},{Command: "34025", Text: "MCC_NOTIFY_BURNER_PREPARE_FOR_NEXT_COPY", Param: "LPCTSTR pStatus"},{Command: "34026", Text: "MCC_NOTIFY_RIP_STARTED", Param: "ignore"},{Command: "34027", Text: "MCC_NOTIFY_RIP_FINISHED", Param: "ignore"}) commands.Push({Command: "34028", Text: "MCC_NOTIFY_RIP_FAILED", Param: "LPCTSTR pError"},{Command: "34029", Text: "MCC_NOTIFY_RIP_PROGRESS_CHANGED", Param: "ignore"},{Command: "34030", Text: "MCC_NOTIFY_RIP_QUEUE_CHANGED", Param: "ignore"},{Command: "34031", Text: "MCC_NOTIFY_DVD_RIP_STARTED", Param: "ignore"},{Command: "34032", Text: "MCC_NOTIFY_DVD_RIP_FINISHED", Param: "ignore"},{Command: "34033", Text: "MCC_NOTIFY_DVD_RIP_FAILED", Param: "int nErrorCode"}) commands.Push({Command: "34034", Text: "MCC_NOTIFY_DVD_RIP_PROGRESS_CHANGED", Param: "int nPercent"},{Command: "34035", Text: "MCC_NOTIFY_DOWNLOAD_FINISHED", Param: "int nFileKey (-1: unknown)"},{Command: "34036", Text: "MCC_NOTIFY_DOWNLOAD_FAILED", Param: "int nFileKey (-1: unknown)"},{Command: "34037", Text: "MCC_NOTIFY_DOWNLOAD_STATUS_CHANGED", Param: "ignore"},{Command: "34038", Text: "MCC_NOTIFY_STATUS_CHECKER_COMPLETE", Param: "ignore"}) commands.Push({Command: "34039", Text: "MCC_NOTIFY_CURRENT_ZONE_CHANGED", Param: "ignore"},{Command: "34045", Text: "MCC_NOTIFY_UI_SKIN_CHANGED", Param: "ignore"},{Command: "34057", Text: "MCC_NOTIFY_HANDHELD_AFTER_DEVICE_CHANGED", Param: "ignore"}) commands.Push({Command: "34040", Text: "MCC_NOTIFY_DISPLAY_OWNER_CHANGED", Param: "JRWnd * pwndOwner"},{Command: "34041", Text: "MCC_NOTIFY_AFTER_FIRST_UPDATE_LAYOUT_WINDOW", Param: "ignore"},{Command: "34042", Text: "MCC_NOTIFY_AFTER_FIRST_UPDATE_APPLY_VIEW_STATE", Param: "ignore"},{Command: "34043", Text: "MCC_NOTIFY_PROCESS_TIME_REMAINING", Param: "int nSecondsRemaining"},{Command: "34044", Text: "MCC_NOTIFY_UI_UPDATE_ENABLE_DISABLE_STATES", Param: "ignore"}) commands.Push({Command: "34046", Text: "MCC_UPDATE_WINDOW_LAYOUT", Param: "ignore"},{Command: "34047", Text: "MCC_NOTIFY_SAVE_UI_BEFORE_SHUTDOWN", Param: "ignore"},{Command: "34048", Text: "MCC_OBSOLETE_34046", Param: "ignore"},{Command: "34049", Text: "MCC_NOTIFY_PLAYLIST_FILES_CHANGED", Param: "int nPlaylistID"},{Command: "34050", Text: "MCC_NOTIFY_PLAYLIST_INFO_CHANGED", Param: "int nPlaylistID"},{Command: "34051", Text: "MCC_NOTIFY_PLAYLIST_ADDED_INTERNAL", Param: "int nPlaylistID"}) commands.Push({Command: "34052", Text: "MCC_NOTIFY_PLAYLIST_ADDED_BY_USER", Param: "int nPlaylistID"},{Command: "34053", Text: "MCC_NOTIFY_PLAYLIST_REMOVED", Param: "int nPlaylistID"},{Command: "34054", Text: "MCC_NOTIFY_PLAYLIST_COLLECTION_CHANGED", Param: "ignore"},{Command: "34055", Text: "MCC_NOTIFY_PLAYLIST_PROPERTIES_CHANGED", Param: "int nPlaylistID"},{Command: "34056", Text: "MCC_NOTIFY_HANDHELD_UPLOAD_STARTED", Param: "int nDeviceSessionID (0 gets default)"}) commands.Push({Command: "34058", Text: "MCC_NOTIFY_HANDHELD_QUEUE_CHANGED", Param: "ignore"},{Command: "34059", Text: "MCC_NOTIFY_HANDHELD_INFO_COMPLETE", Param: "ignore"},{Command: "34060", Text: "MCC_NOTIFY_HANDHELD_AFTER_UPLOAD_FINISHED", Param: "ignore"},{Command: "34061", Text: "MCC_NOTIFY_COMPACT_MEMORY", Param: "ignore"},{Command: "34062", Text: "MCC_NOTIFY_SEARCH_CHANGED", Param: "ignore"},{Command: "34063", Text: "MCC_NOTIFY_SEARCH_CONTEXT_CHANGED", Param: "ignore"}) commands.Push({Command: "34064", Text: "MCC_NOTIFY_UPDATE_SHOPPING_CART", Param: "JRStoreBase * pStore"},{Command: "34065", Text: "MCC_NOTIFY_UPDATE_NAVIGATION_TRAIL", Param: "ignore"},{Command: "34066", Text: "MCC_NOTIFY_IMPORT_STARTED", Param: "bool bSilent"},{Command: "34067", Text: "MCC_NOTIFY_IMPORT_FINISHED", Param: "bool bSilent"},{Command: "34068", Text: "MCC_NOTIFY_ROTATED_IMAGES", Param: "MFKEY nKey"},{Command: "34069", Text: "MCC_NOTIFY_LOGIN_STATE_CHANGE", Param: "bool bLoggedIn"}) commands.Push({Command: "34070", Text: "MCC_NOTIFY_MYGAL_PROGRESS", Param: "ignore"},{Command: "34071", Text: "MCC_NOTIFY_MYGAL_DONE", Param: "ignore"},{Command: "34072", Text: "MCC_NOTIFY_PODCAST_CHANGED", Param: "ignore"},{Command: "34073", Text: "MCC_NOTIFY_PODCAST_SETTINGS_CHANGED", Param: "ignore"},{Command: "34074", Text: "MCC_NOTIFY_CONVERT_PROGRESS", Param: "ignore"},{Command: "34075", Text: "MCC_NOTIFY_CONVERT_UPDATE", Param: "ignore"}) commands.Push({Command: "34076", Text: "MCC_NOTIFY_BREADCRUMBS_CHANGED", Param: "ignore"},{Command: "34077", Text: "MCC_NOTIFY_UI_LANGUAGE_CHANGED", Param: "ignore"},{Command: "34078", Text: "MCC_NOTIFY_INSTALLED_PLUGINS_CHANGED", Param: "ignore"},{Command: "34079", Text: "MCC_NOTIFY_SUGGESTED_MUSIC_CHANGED", Param: "ignore"},{Command: "34080", Text: "MCC_NOTIFY_VIEW_SETTINGS_CHANGED", Param: "int nFlags"},{Command: "34081", Text: "MCC_NOTIFY_BEFORE_CONFIGURE_VIEW_SETTINGS", Param: "ignore"}) commands.Push({Command: "34082", Text: "MCC_NOTIFY_TV_RECORDING_CHANGED", Param: "ignore"},{Command: "34083", Text: "MCC_NOTIFY_TV_PROGRAMMING_GUIDE_CHANGED", Param: "ignore"},{Command: "34084", Text: "MCC_NOTIFY_TV_CHANNELS_CHANGED", Param: "ignore"},{Command: "34085", Text: "MCC_NOTIFY_TV_RECORDING_STARTED", Param: "ignore"},{Command: "34086", Text: "MCC_NOTIFY_TV_RECORDING_FINISHED", Param: "ignore"},{Command: "34087", Text: "MCC_NOTIFY_IMPORT_FILES_ADDED", Param: "ignore"}) commands.Push({Command: "34088", Text: "MCC_NOTIFY_PLAYBACK_OPTIONS_CHANGED", Param: "ignore"},{Command: "34089", Text: "MCC_NOTIFY_BEFORE_LAYOUT_USER_INTERFACE", Param: "ignore"},{Command: "34090", Text: "MCC_NOTIFY_AFTER_LAYOUT_USER_INTERFACE", Param: "ignore"},{Command: "34091", Text: "MCC_NOTIFY_ZONE_ADDED_OR_REMOVED", Param: "int nZoneID (PLAYER_ZONE_ID_UNDEFINED means multiple changes)"},{Command: "34092", Text: "MCC_NOTIFY_ZONE_LINKED_OR_UNLINKED", Param: "ignore"}) commands.Push({Command: "34094", Text: "MCC_NOTIFY_DSP_SETTINGS_CHANGED_IN_CODE", Param: "int nZoneID"},{Command: "34095", Text: "MCC_NOTIFY_OPTICAL_DISC_CHANGED", Param: "ignore"},{Command: "35000", Text: "MCC_STORE_DOWNLOAD", Param: "bool bAllowPurchaseType"},{Command: "35001", Text: "MCC_STORE_PURCHASE", Param: "MFKEY nKey"},{Command: "35002", Text: "MCC_STORE_SEARCH_AMAZON", Param: "MFKEY nKey"},{Command: "35003", Text: "MCC_STORE_SEARCH_AMAZON_MP3_STORE", Param: "MFKEY nKey"}) commands.Push({Command: "35004", Text: "MCC_STORE_TSHIRT", Param: "MFKEY nKey"}) ; Use a Scripting.Dictionary so I can have numbers as keys along with letters. mccCommands := ComObjCreate("Scripting.Dictionary") mccCommands.add("commandTypes", [{type: "Playback", start: 10000, end: 19999}, {type: "File", start: 20000, end: 20999}, {type: "Edit", start: 21000, end: 21999}, {type: "View", start: 22000, end: 22999}, {type: "Tools", start: 23000, end: 23999}, {type: "Help", start: 24000, end: 24999}, {type: "Tree", start: 25000, end: 25999}, {type: "List", start: 26000, end: 26999}, {type: "System", start: 27000, end: 27999}, {type: "PlaybackEngine", start: 28000, end: 28999}, {type: "Other", start: 30000, end: 30999}, {type: "ImageTools", start: 31000, end: 31999}, {type: "Query", start: 32000, end: 32999}, {type: "Commands", start: 33000, end: 33999}, {type: "Notifications", start: 34000, end: 34999}, {type: "Store", start: 35000, end: 35999}]) mccCommands := InitializeCommandsText(mccCommands, commandIndex) mccCommands := InitializeKeyLookup(mccCommands, commandIndex, commands) return mccCommands } ; Populate the AllCommandsText for searching InitializeCommandsText(mccCommands, commandIndex) { for index, command in mccCommands.item("commandTypes") { mccCommands := InitializeAllCommandsText(mccCommands, index) for key, value in commandIndex { mccCommands := AppendCommandIfInRange(mccCommands, index, key, value.Command) } mccCommands := RemoveLeadingSeparator(mccCommands, index) } return mccCommands } InitializeAllCommandsText(mccCommands, index) { if(!mccCommands.item("commandTypes")[index].AllCommandsText) mccCommands.item("commandTypes")[index].AllCommandsText := "" return mccCommands } AppendCommandIfInRange(mccCommands, index, key, commandId) { global COMMANDS_TEXT_SEPARATOR if(commandId >= mccCommands.item("commandTypes")[index].start && commandId <= mccCommands.item("commandTypes")[index].end) { mccCommands.item("commandTypes")[index].AllCommandsText .= COMMANDS_TEXT_SEPARATOR . key } return mccCommands } RemoveLeadingSeparator(mccCommands, index) { global COMMANDS_TEXT_SEPARATOR if(SubStr(mccCommands.item("commandTypes")[index].AllCommandsText, 1, 1) = COMMANDS_TEXT_SEPARATOR) mccCommands.item("commandTypes")[index].AllCommandsText := SubStr(mccCommands.item("commandTypes")[index].AllCommandsText, 2, StrLen(mccCommands.item("commandTypes")[index].AllCommandsText)) return mccCommands } ; Add Command Text as keys with value := Command + Text + Param to mccCommands InitializeKeyLookup(mccCommands, commandIndex, commands) { for key, value in commandIndex { mccCommands.add(key, value) } for index, command in commands { mccCommands.add(command.Command, command) mccCommands.add(command.Text, command) if(CommandNotAlreadyAdded(command.Command)) mccCommands := AppendCommandText(mccCommands, command.Text, command.Command) } return mccCommands } CommandNotAlreadyAdded(command) { global DEFAULT_KEYBOARD_SHORTCUTS_FILE xml := LoadXml(DEFAULT_KEYBOARD_SHORTCUTS_FILE) commands := Object() return !xml.selectNodes("/MJRS/COMMANDS/Entry[@Command=" . command . "]").Length() } ; Append non-default commands to the AllCommandsText AppendCommandText(mccCommands, text, commandId) { for index, command in mccCommands.item("commandTypes") { mccCommands := InitializeAllCommandsText(mccCommands, index) mccCommands := AppendCommandIfInRange(mccCommands, index, text, commandId) mccCommands := RemoveLeadingSeparator(mccCommands, index) } return mccCommands } LoadShortcutFile(file) { xml := LoadXml(file) return ParseShortcuts(xml) } ParseShortcuts(xml) { shortcuts := Object() for node in xml.selectNodes("//Entry") { parsed := StrSplit(node.getAttribute("Key"), ";") parsedKey := parsed[parsed.length()] parsedModifiers := "" Loop % parsed.length() - 1 { parsedModifiers .= parsed[A_Index] . ";" } parsedModifiers := SubStr(parsedModifiers, 1, StrLen(parsedModifiers) - 1) shortcuts.Push({origKey: node.getAttribute("Key"), key: parsedKey, modifiers: parsedModifiers, command: node.getAttribute("Command"), param: node.getAttribute("Param"), global: node.getAttribute("Global")}) ;~ msgbox % "Key: " node.getAttribute("Key") "`nCommand: " node.getAttribute("Command") "`nParam: " node.getAttribute("Param") "`nGlobal: " node.getAttribute("Global") } return shortcuts } PopulateAssignedShortcutsListView(shortcuts) { global mccCommands LV_Delete() for key, value in shortcuts { globalShortcut := value.global ? "yes" : "no" command := mccCommands.Exists(value.command) = -1 ? mccCommands.item(value.Command).Text : value.command LV_Add("", value.key, value.modifiers, globalShortcut, command, value.param) } } PopulateActions() { global mccCommands, commandIndex for index, commandType in mccCommands.item("commandTypes") { tempId := TV_Add(commandType.type, 0) AddCommands(commandType.AllCommandsText, tempId) } } AddCommands(commands, parentId) { Loop, Parse, % commands, `, { TV_Add(A_LoopField, parentId) } } ImportShortcuts(importFile) { global USER_DEFINED_KEYBOARD_SHORTCUTS_FILE xml := LoadXml(USER_DEFINED_KEYBOARD_SHORTCUTS_FILE) imported := LoadShortcutFile(importFile) Loop, % imported.Length() { xml := RemoveNode(xml, imported[A_Index].origKey) xml := CreateNodeFromImport(xml, imported[A_Index]) } xml.selectSingleNode("/MJRS/ACCELERATORS").appendChild(xml.createTextNode("`n ")) return xml } CreateNodeFromImport(xml, shortCut) { global NODE_ELEMENT parent := xml.selectSingleNode("/MJRS/ACCELERATORS") node := xml.createNode(NODE_ELEMENT, "Entry", "") node.setAttribute("Key", shortCut.origKey) ; check if you need to ad Type="Program" if(InStr(shortCut.Command, ".")) node.setAttribute("Type", "Program") node.setAttribute("Command", shortCut.Command) if(shortCut.Param != "") node.setAttribute("Param", shortCut.Param) node.setAttribute("Global", shortCut.Global) parent.appendChild(xml.createTextNode("`n`t`t")) parent.appendChild(node) return xml } DisplayAboutPopup() { Gui, About:New, hwndAboutGui Gui, About:Default Gui, Add, Text, x12 y10 w310 h50 , This gui was created by request to make modifying J River shorcuts easy`, as well as backuing up and exporting/importing commands. See: Gui, Add, Link, x95 y35, original post ; Generated using SmartGUI Creator 4.0 Gui, Show, x127 y87 h65 w339, About WinWaitClose, ahk_id %AboutGui% return Gui, HotkeyConfig:Default AboutGuiEscape: AboutGuiClose: Gui, About:Destroy return } AddMatchingActions(search) { global mccCommands TV_Delete() if(search = "") { PopulateActions() return } for index, commandType in mccCommands.item("commandTypes") { ; todo if(InStr(commandType.AllCommandsText, search)) { tempId := TV_Add(commandType.type, 0) AddMatchingCommands(commandType.AllCommandsText, tempId, search) } } } AddMatchingCommands(commands, parentId, search) { Loop, Parse, % commands, `, { if(InStr(A_LoopField, search)) { TV_Add(A_LoopField, parentId) } } } EnableForm() { GuiControl, Enable, filter GuiControl, Enable, ActionList GuiControl, Enable, selectedHotkey GuiControl, Enable, globalCheck } ClearKeyAndGlobal() { GuiControl,, selectedHotkey, GuiControl,, globalCheck, 0 } HotkeySelection() { GuiControlGet, key,, selectedHotkey parsed := StrSplit(key) parsedKey := parsed[parsed.length()] modifiers := {"+": "Shift", "^": "Ctrl", "!": "Alt"} parsedModifiers := "" Loop % parsed.length() - 1 { parsedModifiers .= modifiers[parsed[A_Index]] . ";" } parsedModifiers := SubStr(parsedModifiers, 1, StrLen(parsedModifiers) - 1) return {key: parsedKey, modifiers: parsedModifiers} } AssignedShortCutSelected() { return LV_GetNext(0) } UpdateXml() { global USER_DEFINED_KEYBOARD_SHORTCUTS_FILE xml := LoadXml(USER_DEFINED_KEYBOARD_SHORTCUTS_FILE) ; Save the list data Loop, % LV_GetCount() { rowData := RowText(A_Index) key := rowData.modifiers . ";" . rowData.key xml := RemoveNode(xml, key) xml := CreateNode(xml, rowData, key) } xml.selectSingleNode("/MJRS/ACCELERATORS").appendChild(xml.createTextNode("`n ")) return xml } RowText(rowNumber) { LV_GetText(key, rowNumber, 1) LV_GetText(modifiers, rowNumber, 2) LV_GetText(global, rowNumber, 3) LV_GetText(action, rowNumber, 4) LV_GetText(parameter, rowNumber, 5) return {key: key, modifiers: modifiers, command: action, param: parameter, global: global} } RemoveNode(xml, key) { entryParent := xml.selectSingleNode("/MJRS/ACCELERATORS") node := xml.selectSingleNode("//Entry[@Key=""" . key . """]") if(IsObject(node)) entryparent.removeChild(node) return xml } CreateNode(xml, rowData, key) { global mccCommands, NODE_ELEMENT parent := xml.selectSingleNode("/MJRS/ACCELERATORS") node := xml.createNode(NODE_ELEMENT, "Entry", "") globalShortcut := value.global = "yes" ? 1 : 1 node.setAttribute("Key", key) ; check if you need to add Type="Program" if(InStr(rowData.command, ".")) { node.setAttribute("Type", "Program") node.setAttribute("Command", rowData.command) } else node.setAttribute("Command", mccCommands.item(rowData.command).command) if(rowData.param != "") node.setAttribute("Param", rowData.param) node.setAttribute("Global", globalShortcut) parent.appendChild(xml.createTextNode("`n`t`t")) parent.appendChild(node) return xml } SaveXml(xml, file) { xml.save(file) } NotTypeOfCommand(selectedCommandId) { return TV_GetParent(selectedCommandId) } NonDefaultParamenter(type, param) { return (type = "" && param != "" && StrLen(param) > 5) } NonDefaultParameterConfig(commandItem) { global thisParam Gui, ParameterConfig:New, hwndParameterConfigGui Gui, ParameterConfig:Default Gui, Add, Text, x12 y10 w450 h20 , This command's parameter needs to be set`, text from the is below: Gui, Add, Link, x280 y10, documentation Gui, Add, Text, x12 y30 w450 h60 , % commandItem.Param Gui, Add, Edit, x12 y100 w340 h50 vthisParam, Gui, Add, Button, x362 y100 w100 h50 gParameterSave , Save ; Generated using SmartGUI Creator 4.0 Gui, Show, x127 y87 h169 w477, Parameter Config Gui, HotkeyConfig:Default WinWaitClose, ahk_id %ParameterConfigGui% return param ParameterSave: GuiControlGet, newParam,, thisParam param := newParam gosub, ParameterConfigGuiClose return ParameterConfigGuiClose: ParameterConfigGuiEscape: Gui, ParameterConfig:Destroy return } UpdateHotkey(rowNumber) { modifiers := {"+": "Shift", "^": "Ctrl", "!": "Alt"} rowData := RowText(rowNumber) key := rowData.modifiers StringReplace, key, key, `;,,All StringReplace, key, key, Ctrl, ^,,All StringReplace, key, key, Shift, +,,All StringReplace, key, key, Alt, !,,All key .= rowData.key GuiControl,, selectedHotkey, %key% } UpdateGlobalHotkey(rowNumber) { globalShortcut := RowText(rowNumber).global = "yes" ? True : False GuiControl,, globalCheck, %globalShortcut% } UpdateAssignedShortcutsGlobalHotkey(rowNumber) { GuiControlGet, globalChecked,, globalCheck globalShortcut := globalChecked ? "yes" : "no" LV_Modify(rowNumber, "",,, globalShortcut) } ResetShortcutsToDefault() { global USER_DEFINED_KEYBOARD_SHORTCUTS_FILE ; Backup current shortcut file backup_file := A_Temp . "\JRiverShorcuts.xml" FileCopy, %USER_DEFINED_KEYBOARD_SHORTCUTS_FILE%, %backup_file%, 1 return backup_file } ResetView(userShortcuts) { PopulateAssignedShortcutsListView(userShortcuts) PopulateActions() } DefaultUserShortcuts() { shortcuts := Object() shortcuts.Push({key: "1", modifiers: "Ctrl", origKey: "Ctrl;1", command: "10004", param: "0", global: 1}) shortcuts.Push({key: "NumPad1", modifiers: "Ctrl", origKey: "Ctrl;NumPad1", command: "10004", param: "0", global: 0}) shortcuts.Push({key: "2", modifiers: "Ctrl", origKey: "Ctrl;2", command: "10000", param: "0", global: 1}) shortcuts.Push({key: "NumPad2", modifiers: "Ctrl", origKey: "Ctrl;NumPad2", command: "10000", param: "0", global: 1}) shortcuts.Push({key: "3", modifiers: "Ctrl", origKey: "Ctrl;3", command: "10002", param: "0", global: 1}) shortcuts.Push({key: "NumPad3", modifiers: "Ctrl", origKey: "Ctrl;NumPad3", command: "10002", param: "0", global: 1}) shortcuts.Push({key: "4", modifiers: "Ctrl", origKey: "Ctrl;4", command: "10003", param: "0", global: 1}) shortcuts.Push({key: "NumPad4", modifiers: "Ctrl", origKey: "Ctrl;NumPad4", command: "10003", param: "0", global: 1}) shortcuts.Push({key: "5", modifiers: "Ctrl", origKey: "Ctrl;5", command: "10033", param: "0", global: 1}) shortcuts.Push({key: "NumPad5", modifiers: "Ctrl", origKey: "Ctrl;NumPad5", command: "10033", param: "0", global: 1}) shortcuts.Push({key: "6", modifiers: "Ctrl", origKey: "Ctrl;6", command: "MC13.exe", param: "/Command Pause", global: 1}) shortcuts.Push({key: "7", modifiers: "Ctrl", origKey: "Ctrl;7", command: "calc.exe", global: 1}) shortcuts.Push({key: "1", modifiers: "Ctrl;Shift", origKey: "Ctrl;Shift;1", command: "30007", param: "Keyboard Playlists\1", global: 1}) shortcuts.Push({key: "NumPad1", modifiers: "Ctrl;Shift", origKey: "Ctrl;Shift;NumPad1", command: "30007", param: "Keyboard Playlists\1", global: 1}) shortcuts.Push({key: "2", modifiers: "Ctrl;Shift", origKey: "Ctrl;Shift;2", command: "30007", param: "Keyboard Playlists\2", global: 1}) shortcuts.Push({key: "NumPad2", modifiers: "Ctrl;Shift", origKey: "Ctrl;Shift;NumPad2", command: "30007", param: "Keyboard Playlists\2", global: 1}) shortcuts.Push({key: "3", modifiers: "Ctrl;Shift", origKey: "Ctrl;Shift;3", command: "30007", param: "Keyboard Playlists\3", global: 1}) shortcuts.Push({key: "NumPad3", modifiers: "Ctrl;Shift", origKey: "Ctrl;Shift;NumPad3", command: "30007", param: "Keyboard Playlists\3", global: 1}) shortcuts.Push({key: "4", modifiers: "Ctrl;Shift", origKey: "Ctrl;Shift;4", command: "30007", param: "Keyboard Playlists\4", global: 1}) shortcuts.Push({key: "NumPad4", modifiers: "Ctrl;Shift", origKey: "Ctrl;Shift;NumPad4", command: "30007", param: "Keyboard Playlists\4", global: 1}) return shortcuts } DisclaimerNotRead() { IniRead, disclaimerRead, %A_ScriptFullPath%:Stream:$DATA, DISCLAIMER return !disclaimerRead } Disclaimer() { IniWrite, TRUE, %A_ScriptFullPath%:Stream:$DATA, DISCLAIMER disclaimer = ( THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ) msgbox % disclaimer }