[SHELL32]

- Implement handling accelerators for CDesktopBrowser. The only noticeable difference is that pressing alt+f4 in the desktop doesn't close it.
See issue #8864 for more details.

svn path=/trunk/; revision=65557
This commit is contained in:
Giannis Adamopoulos 2014-12-04 17:30:44 +00:00
parent d1c24a9a68
commit 8492b3df2a
3 changed files with 72 additions and 4 deletions

View file

@ -35,6 +35,7 @@ class CDesktopBrowser :
{
public:
DWORD Tag;
HACCEL m_hAccel;
private:
HWND hWnd;
HWND hWndShellView;
@ -44,6 +45,9 @@ private:
CComPtr<IShellBrowser> DefaultShellBrowser;
LPITEMIDLIST pidlDesktopDirectory;
LPITEMIDLIST pidlDesktop;
LRESULT CDesktopBrowser::_NotifyTray(UINT uMsg, WPARAM wParam, LPARAM lParam);
public:
CDesktopBrowser();
~CDesktopBrowser();
@ -51,8 +55,9 @@ public:
HWND FindDesktopListView ();
BOOL CreateDeskWnd();
HWND DesktopGetWindowControl(IN UINT id);
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam);
static LRESULT CALLBACK ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam);
static BOOL MessageLoop();
BOOL MessageLoop();
// *** IOleWindow methods ***
virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *lphwnd);
@ -252,7 +257,9 @@ HRESULT STDMETHODCALLTYPE CDesktopBrowser::EnableModelessSB(BOOL fEnable)
HRESULT STDMETHODCALLTYPE CDesktopBrowser::TranslateAcceleratorSB(LPMSG lpmsg, WORD wID)
{
return S_FALSE;
if (!::TranslateAcceleratorW(hWnd, m_hAccel, lpmsg))
return S_FALSE;
return S_OK;
}
HRESULT STDMETHODCALLTYPE CDesktopBrowser::BrowseObject(LPCITEMIDLIST pidl, UINT wFlags)
@ -370,14 +377,52 @@ BOOL CDesktopBrowser::MessageLoop()
{
if (bRet != -1)
{
TranslateMessage(&Msg);
DispatchMessageW(&Msg);
if (DesktopView->TranslateAcceleratorW(&Msg) != S_OK)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
}
return TRUE;
}
#define TWM_DOEXITWINDOWS (WM_USER + 342)
#define TWM_CYCLEFOCUS (WM_USER + 348)
LRESULT CDesktopBrowser::_NotifyTray(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
HWND hwndTray;
HRESULT hres;
hres = this->ShellDesk->GetTrayWindow(&hwndTray);
if (SUCCEEDED(hres))
PostMessageW(hwndTray, uMsg, wParam, lParam);
return 0;
}
LRESULT CDesktopBrowser::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (LOWORD(wParam))
{
case FCIDM_DESKBROWSER_CLOSE:
return _NotifyTray(TWM_DOEXITWINDOWS, 0, 0);
case FCIDM_DESKBROWSER_FOCUS:
if (GetKeyState(VK_SHIFT))
return _NotifyTray(TWM_CYCLEFOCUS, 1, 0xFFFFFFFF);
else
return _NotifyTray(TWM_CYCLEFOCUS, 1, 1);
case FCIDM_DESKBROWSER_SEARCH:
SHFindFiles(NULL, NULL);
break;
case FCIDM_DESKBROWSER_REFRESH:
break;
}
}
LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam)
{
CDesktopBrowser *pThis = NULL;
@ -445,6 +490,9 @@ LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg,
if (!pThis->CreateDeskWnd())
WARN("Could not create the desktop view control!\n");
pThis->m_hAccel = LoadAcceleratorsW(shell32_hInstance, MAKEINTRESOURCEW(3));
break;
}
@ -476,6 +524,8 @@ LRESULT CALLBACK CDesktopBrowser::ProgmanWindowProc(IN HWND hwnd, IN UINT uMsg,
SHOnCWMCommandLine((HANDLE)lParam);
break;
case WM_COMMAND:
return pThis->OnCommand(uMsg, wParam, lParam);
default:
DefMsgHandler:
Ret = DefWindowProcW(hwnd, uMsg, wParam, lParam);

View file

@ -56,6 +56,17 @@ BEGIN
VK_F5, FCIDM_SHVIEW_REFRESH, VIRTKEY
END
IDA_DESKBROWSER ACCELERATORS
BEGIN
//"s", 34172, ALT
VK_F4, FCIDM_DESKBROWSER_CLOSE, VIRTKEY, ALT
VK_F6, FCIDM_DESKBROWSER_FOCUS, VIRTKEY
VK_TAB, FCIDM_DESKBROWSER_FOCUS, VIRTKEY
VK_TAB, FCIDM_DESKBROWSER_FOCUS, VIRTKEY, SHIFT
VK_F3, FCIDM_DESKBROWSER_SEARCH, VIRTKEY
VK_F5, FCIDM_DESKBROWSER_REFRESH, VIRTKEY
END
/*
* This include a set of Shell32 icons,
* bitmaps and avi files. Licence's can be

View file

@ -22,6 +22,7 @@
/* Accelerators */
#define IDA_SHELLVIEW 1
#define IDA_DESKBROWSER 3
/* Bitmaps */
#define IDB_REACTOS 131
@ -485,6 +486,12 @@
#define IDR_AVI_FILENUKE 163
#define IDR_AVI_FILEDELETE 164
/* Desktop Browser commands */
#define FCIDM_DESKBROWSER_CLOSE 0xA004
#define FCIDM_DESKBROWSER_FOCUS 0xA030
#define FCIDM_DESKBROWSER_SEARCH 0xA085
#define FCIDM_DESKBROWSER_REFRESH 0xA220
/* Shell view commands */
#define FCIDM_SHVIEW_ARRANGE 0x7001
#define FCIDM_SHVIEW_DELETE 0x7011