From d1c24a9a68c73b8f4e898707afc37c28f2a00513 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 4 Dec 2014 17:20:43 +0000 Subject: [PATCH] [EXPLORER] - Implement registering all hotkeys that explorer registers in windows. Not all of them are implemented. The ones that are implemented work fine in windows but most of them don't work on ros. Thankfully nothing regressed by doing things the same with windows . svn path=/trunk/; revision=65556 --- reactos/base/shell/explorer/explorer.cpp | 3 - reactos/base/shell/explorer/explorer.rc | 6 + reactos/base/shell/explorer/precomp.h | 2 - reactos/base/shell/explorer/resource.h | 1 + reactos/base/shell/explorer/traywnd.cpp | 153 +++++++++++++++-------- 5 files changed, 107 insertions(+), 58 deletions(-) diff --git a/reactos/base/shell/explorer/explorer.cpp b/reactos/base/shell/explorer/explorer.cpp index 0751e75e1d5..187201a70dc 100644 --- a/reactos/base/shell/explorer/explorer.cpp +++ b/reactos/base/shell/explorer/explorer.cpp @@ -182,9 +182,6 @@ StartWithDesktop(IN HINSTANCE hInstance) if (Tray != NULL) { -#if !WIN7_COMPAT_MODE - RegisterHotKey(NULL, IDHK_RUN, MOD_WIN, 'R'); -#endif TrayMessageLoop(Tray); #if !WIN7_COMPAT_MODE HideMinimizedWindows(FALSE); diff --git a/reactos/base/shell/explorer/explorer.rc b/reactos/base/shell/explorer/explorer.rc index 323d7318e7d..a7f9c6afd9b 100644 --- a/reactos/base/shell/explorer/explorer.rc +++ b/reactos/base/shell/explorer/explorer.rc @@ -25,6 +25,12 @@ IDB_TASKBARPROP_NOLOCK_GROUP_QL BITMAP "res/nolock_group_ql.bmp" CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "explorer.exe.manifest" +STRINGTABLE +BEGIN + //IDS_HELP_COMMAND "helpctr.exe>-FromStartHelp" + IDS_HELP_COMMAND "https://www.reactos.org/" +END + /* UTF-8 */ #pragma code_page(65001) diff --git a/reactos/base/shell/explorer/precomp.h b/reactos/base/shell/explorer/precomp.h index 5d66bdd9699..877e80b0a1d 100644 --- a/reactos/base/shell/explorer/precomp.h +++ b/reactos/base/shell/explorer/precomp.h @@ -108,8 +108,6 @@ IN const DROPTARGET_CALLBACKS *Callbacks OPTIONAL); * explorer.c */ -#define IDHK_RUN 1 /* Win+R */ - LONG SetWindowStyle(IN HWND hWnd, IN LONG dwStyleMask, diff --git a/reactos/base/shell/explorer/resource.h b/reactos/base/shell/explorer/resource.h index e8b32e4aa25..08ac0614b62 100644 --- a/reactos/base/shell/explorer/resource.h +++ b/reactos/base/shell/explorer/resource.h @@ -109,3 +109,4 @@ #define IDC_TASKBARPROP_DESKBANDLIST 2301 #define IDS_TASKBAR_STARTMENU_PROP_CAPTION 2200 +#define IDS_HELP_COMMAND 732 diff --git a/reactos/base/shell/explorer/traywnd.cpp b/reactos/base/shell/explorer/traywnd.cpp index 7bc06cbfddc..79f58e5f327 100644 --- a/reactos/base/shell/explorer/traywnd.cpp +++ b/reactos/base/shell/explorer/traywnd.cpp @@ -40,6 +40,19 @@ HRESULT TrayWindowCtxMenuCreator(ITrayWindow * TrayWnd, IN HWND hWndOwner, ICont #define AUTOHIDE_SHOWN 2 #define AUTOHIDE_HIDING 3 +#define IDHK_RUN 0x1f4 +#define IDHK_MINIMIZE_ALL 0x1f5 +#define IDHK_RESTORE_ALL 0x1f6 +#define IDHK_HELP 0x1f7 +#define IDHK_EXPLORE 0x1f8 +#define IDHK_FIND 0x1f9 +#define IDHK_FIND_COMPUTER 0x1fa +#define IDHK_NEXT_TASK 0x1fb +#define IDHK_PREV_TASK 0x1fc +#define IDHK_SYS_PROPERTIES 0x1fd +#define IDHK_DESKTOP 0x1fe +#define IDHK_PAGER 0x1ff + static LONG TrayWndCount = 0; static const WCHAR szTrayWndClass [] = TEXT("Shell_TrayWnd"); @@ -201,19 +214,6 @@ public: PostQuitMessage(0); } - BOOL LaunchCPanel(HWND hwnd, LPCTSTR applet) - { - WCHAR szParams[MAX_PATH]; - - StringCbCopy(szParams, sizeof(szParams), - TEXT("shell32.dll,Control_RunDLL ")); - if (FAILED_UNEXPECTEDLY(StringCbCat(szParams, sizeof(szParams), - applet))) - return FALSE; - - return (ShellExecute(hwnd, TEXT("open"), TEXT("rundll32.exe"), szParams, NULL, SW_SHOWDEFAULT) > (HINSTANCE) 32); - } - /* * ITrayWindow */ @@ -1577,6 +1577,20 @@ SetStartBtnImage: AutoHideState = AUTOHIDE_HIDING; SetTimer(TIMER_ID_AUTOHIDE, AUTOHIDE_DELAY_HIDE, NULL); } + + RegisterHotKey(m_hWnd, IDHK_RUN, MOD_WIN, 'R'); + RegisterHotKey(m_hWnd, IDHK_MINIMIZE_ALL, MOD_WIN, 'M'); + RegisterHotKey(m_hWnd, IDHK_RESTORE_ALL, MOD_WIN|MOD_SHIFT, 'M'); + RegisterHotKey(m_hWnd, IDHK_HELP, MOD_WIN, VK_F1); + RegisterHotKey(m_hWnd, IDHK_EXPLORE, MOD_WIN, 'E'); + RegisterHotKey(m_hWnd, IDHK_FIND, MOD_WIN, 'F'); + RegisterHotKey(m_hWnd, IDHK_FIND_COMPUTER, MOD_WIN|MOD_CONTROL, 'F'); + RegisterHotKey(m_hWnd, IDHK_NEXT_TASK, MOD_WIN, VK_TAB); + RegisterHotKey(m_hWnd, IDHK_PREV_TASK, MOD_WIN|MOD_SHIFT, VK_TAB); + RegisterHotKey(m_hWnd, IDHK_SYS_PROPERTIES, MOD_WIN, VK_PAUSE); + RegisterHotKey(m_hWnd, IDHK_DESKTOP, MOD_WIN, 'D'); + RegisterHotKey(m_hWnd, IDHK_PAGER, MOD_WIN, 'B'); + return TRUE; } @@ -1789,7 +1803,8 @@ SetStartBtnImage: break; case ID_SHELL_CMD_ADJUST_DAT: - LaunchCPanel(NULL, TEXT("timedate.cpl")); + //FIXME: Use SHRunControlPanel + ShellExecuteW(m_hWnd, NULL, L"timedate.cpl", NULL, NULL, SW_NORMAL); break; default: @@ -2581,7 +2596,10 @@ HandleTrayContextMenu: ptClick.x = MAKEPOINTS(lParam).x; ptClick.y = MAKEPOINTS(lParam).y; if (PtInRect(&rcClock, ptClick)) - LaunchCPanel(NULL, TEXT("timedate.cpl")); + { + //FIXME: use SHRunControlPanel + ShellExecuteW(m_hWnd, NULL, L"timedate.cpl", NULL, NULL, SW_NORMAL); + } } return TRUE; } @@ -2637,6 +2655,70 @@ HandleTrayContextMenu: return TRUE; } + HRESULT ExecResourceCmd(int id) + { + WCHAR szCommand[256]; + WCHAR *pszParameters; + + if (!LoadString(hExplorerInstance, + id, + szCommand, + sizeof(szCommand) / sizeof(szCommand[0]))) + { + return E_FAIL; + } + + pszParameters = wcschr(szCommand, L'>'); + if (!pszParameters) + return E_FAIL; + + *pszParameters = 0; + pszParameters++; + + ShellExecuteW(m_hWnd, NULL, szCommand, pszParameters, NULL, 0); + return S_OK; + } + + LRESULT OnHotkey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + switch (wParam) + { + case IDHK_RUN: + DisplayRunFileDlg(); + break; + case IDHK_HELP: + ExecResourceCmd(IDS_HELP_COMMAND); + break; + case IDHK_EXPLORE: + ShellExecuteW(0, L"explore", NULL, NULL, NULL, 1); + break; + case IDHK_FIND: + SHFindFiles(NULL, NULL); + break; + case IDHK_FIND_COMPUTER: + SHFindComputer(NULL, NULL); + break; + case IDHK_SYS_PROPERTIES: + //FIXME: Use SHRunControlPanel + ShellExecuteW(m_hWnd, NULL, L"sysdm.cpl", NULL, NULL, SW_NORMAL); + break; + case IDHK_NEXT_TASK: + break; + case IDHK_PREV_TASK: + break; + case IDHK_MINIMIZE_ALL: + break; + case IDHK_RESTORE_ALL: + break; + case IDHK_DESKTOP: + break; + case IDHK_PAGER: + break; + } + + return 0; + } + LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { LRESULT Ret = FALSE; @@ -2653,44 +2735,20 @@ HandleTrayContextMenu: { /* FIXME: Handle these commands as well */ case IDM_TASKBARANDSTARTMENU: - DisplayProperties(); break; case IDM_SEARCH: + SHFindFiles(NULL, NULL); break; case IDM_HELPANDSUPPORT: - { - /* TODO: Implement properly */ - - LPCWSTR strSite = L"https://www.reactos.org/"; - - /* TODO: Make localizable */ - LPCWSTR strCaption = L"Sorry"; - LPCWSTR strMessage = L"ReactOS could not browse to '%s' (error %d). Please make sure there is a web browser installed."; - WCHAR tmpMessage[512]; - - /* TODO: Read from the registry */ - LPCWSTR strVerb = NULL; /* default */ - LPCWSTR strPath = strSite; - LPCWSTR strParams = NULL; - - /* The return value is defined as HINSTANCE for backwards compatibility only, the cast is needed */ - int result = (int) ShellExecuteW(m_hWnd, strVerb, strPath, strParams, NULL, SW_SHOWNORMAL); - if (result <= 32) - { - StringCchPrintfW(tmpMessage, 512, strMessage, strSite, result); - MessageBoxExW(m_hWnd, tmpMessage, strCaption, MB_OK, 0); - } + ExecResourceCmd(IDS_HELP_COMMAND); break; - } case IDM_RUN: - { DisplayRunFileDlg(); break; - } /* FIXME: Handle these commands as well */ case IDM_SYNCHRONIZE: @@ -2700,11 +2758,9 @@ HandleTrayContextMenu: break; case IDM_SHUTDOWN: - { DoExitWindows(); break; } - } } return Ret; } @@ -2835,6 +2891,7 @@ HandleTrayContextMenu: MESSAGE_HANDLER(WM_APP_TRAYDESTROY, OnAppTrayDestroy) MESSAGE_HANDLER(TWM_OPENSTARTMENU, OnOpenStartMenu) MESSAGE_HANDLER(TWM_DOEXITWINDOWS, OnDoExitWindows) + MESSAGE_HANDLER(WM_HOTKEY, OnHotkey) ALT_MSG_MAP(1) END_MSG_MAP() @@ -2879,16 +2936,6 @@ HandleTrayContextMenu: if (!Ret || Ret == -1) break; - if (Msg.message == WM_HOTKEY) - { - switch (Msg.wParam) - { - case IDHK_RUN: /* Win+R */ - DisplayRunFileDlg(); - break; - } - } - if (StartMenuBand == NULL || StartMenuBand->IsMenuMessage(&Msg) != S_OK) {