From: David Quintana Date: Thu, 13 Feb 2014 20:16:30 +0000 (+0000) Subject: [RSHELL] X-Git-Tag: backups/shell-experiments@75904~370 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=c486aa0a00da1d310cf31b4de29f3c6c1a1a0342;hp=3bb9ee7f77aea4f24cb247bc21b4a55ec4e0d82c [RSHELL] * Add more missing code. The custom CMenuDeskBand is now able to show the contents of a CMenuSite/CMenuBand in the right size, including the banner (not yet fully functional). * Organize the method list in CMenuSite by interface. [EXPLORER-NEW] * Revert the hacks from r62134. [PSDK] * Add IUnknown_QueryServiceExec to shlwapi_undoc.h svn path=/branches/shell-experiments/; revision=62149 --- diff --git a/base/shell/explorer-new/explorer.c b/base/shell/explorer-new/explorer.c index 87c7e0deb4c..a574a5b93e6 100644 --- a/base/shell/explorer-new/explorer.c +++ b/base/shell/explorer-new/explorer.c @@ -407,7 +407,7 @@ _tWinMain(IN HINSTANCE hInstance, ProcessStartupItems(); - //if (GetShellWindow() == NULL) + if (GetShellWindow() == NULL) CreateShellDesktop = TRUE; /* FIXME - initialize SSO Thread */ @@ -415,7 +415,7 @@ _tWinMain(IN HINSTANCE hInstance, if (CreateShellDesktop) { /* Initialize shell dde support */ - //ShellDDEInit(TRUE); + ShellDDEInit(TRUE); /* Initialize shell icons */ FileIconInit(TRUE); @@ -430,15 +430,15 @@ _tWinMain(IN HINSTANCE hInstance, left screen corner, but is also needed in order to receive HSHELL_* notification messages (which are required for taskbar buttons to work right) */ - /*HideMinimizedWindows(TRUE); + HideMinimizedWindows(TRUE); if (Tray != NULL) - hShellDesktop = DesktopCreateWindow(Tray);*/ + hShellDesktop = DesktopCreateWindow(Tray); } - ///* WinXP: Notify msgina to hide the welcome screen */ - //if (!SetShellReadyEvent(TEXT("msgina: ShellReadyEvent"))) - // SetShellReadyEvent(TEXT("Global\\msgina: ShellReadyEvent")); + /* WinXP: Notify msgina to hide the welcome screen */ + if (!SetShellReadyEvent(TEXT("msgina: ShellReadyEvent"))) + SetShellReadyEvent(TEXT("Global\\msgina: ShellReadyEvent")); } else { diff --git a/base/shell/rshell/CMenuDeskBar.cpp b/base/shell/rshell/CMenuDeskBar.cpp index bfb1ca69eaf..497fcfd28d8 100644 --- a/base/shell/rshell/CMenuDeskBar.cpp +++ b/base/shell/rshell/CMenuDeskBar.cpp @@ -20,6 +20,7 @@ #include "precomp.h" #include "wraplog.h" #include +#include WINE_DEFAULT_DEBUG_CHANNEL(CMenuDeskBar); @@ -143,15 +144,15 @@ public: BEGIN_MSG_MAP(CMenuDeskBar) MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_NOTIFY, OnNotify) + /*MESSAGE_HANDLER(WM_NOTIFY, OnNotify) MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) MESSAGE_HANDLER(WM_CANCELMODE, OnCancelMode) MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) - MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged) + MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged) */ MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) -/* MESSAGE_HANDLER(WM_PAINT, OnPaint) */ + MESSAGE_HANDLER(WM_PAINT, OnPaint) END_MSG_MAP() BEGIN_COM_MAP(CMenuDeskBar) @@ -166,6 +167,8 @@ public: COM_INTERFACE_ENTRY_IID(IID_IBanneredBar, IBanneredBar) COM_INTERFACE_ENTRY_IID(IID_IInitializeObject, IInitializeObject) END_COM_MAP() + + HRESULT _CreateDeskBarWindow(); }; extern "C" @@ -447,6 +450,7 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::OnPosRectChangeDB(LPRECT prc) #else CMenuDeskBar::CMenuDeskBar() : + m_Client(NULL), m_ClientWindow(NULL), m_Vertical(true), m_Visible(false), @@ -459,6 +463,40 @@ CMenuDeskBar::~CMenuDeskBar() { } +HRESULT CMenuDeskBar::_CreateDeskBarWindow() +{ + HRESULT hr; + HWND ownerWindow = NULL; + + if (m_Site) + { + CComPtr oleWindow; + + hr = m_Site->QueryInterface(IID_IOleWindow, reinterpret_cast(&oleWindow)); + if (FAILED(hr)) + return hr; + + hr = oleWindow->GetWindow(&ownerWindow); + if (FAILED(hr)) + return hr; + + if (!::IsWindow(ownerWindow)) + return E_FAIL; + } + + // FIXME + if (m_hWnd) + { + SetWindowLongPtr(m_hWnd, GWLP_HWNDPARENT, (LONG_PTR)ownerWindow); + } + else + { + Create(ownerWindow); + } + + return S_OK; +} + HRESULT STDMETHODCALLTYPE CMenuDeskBar::GetWindow(HWND *lphwnd) { if (lphwnd == NULL) @@ -545,53 +583,36 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::SetClient(IUnknown *punkClient) CComPtr pDeskBandClient; HRESULT hResult; - if (m_hWnd == NULL) - { - HWND ownerWindow = NULL; - if (m_Site) - { - IOleWindow * oleWindow; - - hResult = m_Site->QueryInterface(IID_IOleWindow, reinterpret_cast(&oleWindow)); - if (SUCCEEDED(hResult)) - hResult = oleWindow->GetWindow(&ownerWindow); - - if (!::IsWindow(ownerWindow)) - return E_FAIL; - } - - Create(ownerWindow); - } + m_Client.Release(); if (punkClient == NULL) - m_Client.Release(); - else - { - hResult = punkClient->QueryInterface(IID_IUnknown, reinterpret_cast(&m_Client)); - if (FAILED(hResult)) - return hResult; + return S_OK; - hResult = m_Client->QueryInterface(IID_IDeskBarClient, (VOID**) &pDeskBandClient); - if (FAILED(hResult)) - return hResult; + if (m_hWnd == NULL) + { + _CreateDeskBarWindow(); + } - hResult = pDeskBandClient->SetDeskBarSite(static_cast(this)); - if (FAILED(hResult)) - return hResult; + hResult = punkClient->QueryInterface(IID_IUnknown, reinterpret_cast(&m_Client)); + if (FAILED(hResult)) + return hResult; - } + hResult = m_Client->QueryInterface(IID_IDeskBarClient, (VOID**) &pDeskBandClient); + if (FAILED(hResult)) + return hResult; - return S_OK; + return pDeskBandClient->SetDeskBarSite(static_cast(this)); } HRESULT STDMETHODCALLTYPE CMenuDeskBar::GetClient(IUnknown **ppunkClient) { if (ppunkClient == NULL) return E_POINTER; - *ppunkClient = m_Client; - if (m_Client.p != NULL) - m_Client.p->AddRef(); - return S_OK; + + if (!m_Client) + return E_FAIL; + + return m_Client->QueryInterface(IID_PPV_ARG(IUnknown, ppunkClient)); } HRESULT STDMETHODCALLTYPE CMenuDeskBar::OnPosRectChangeDB(LPRECT prc) @@ -603,52 +624,38 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::OnPosRectChangeDB(LPRECT prc) HRESULT STDMETHODCALLTYPE CMenuDeskBar::SetSite(IUnknown *pUnkSite) { - return S_OK; - CComPtr serviceProvider; - CComPtr profferService; - HRESULT hResult; - CComPtr oleWindow; - HWND ownerWindow; + HRESULT hr; + CComPtr oleWindow; + HWND ownerWindow = NULL; + if (m_Site) + { + if (m_hWnd != NULL) + { + DestroyWindow(); + } + m_Site.Release(); + } - m_Site.Release(); if (pUnkSite == NULL) { return S_OK; } - if (m_hWnd == NULL) - { - // get window handle of parent - hResult = pUnkSite->QueryInterface(IID_ITrayPriv, reinterpret_cast(&m_Site)); - if (FAILED(hResult)) - return hResult; - - hResult = pUnkSite->QueryInterface(IID_IOleWindow, reinterpret_cast(&oleWindow)); - if (SUCCEEDED(hResult)) - hResult = oleWindow->GetWindow(&ownerWindow); - - if (!::IsWindow(ownerWindow)) - return E_FAIL; - - Create(ownerWindow); - } - else - { - //Set Owner ? - } + // get window handle of parent + hr = pUnkSite->QueryInterface(IID_ITrayPriv, reinterpret_cast(&m_Site)); + if (FAILED(hr)) + return hr; - return S_OK; + return _CreateDeskBarWindow(); } HRESULT STDMETHODCALLTYPE CMenuDeskBar::GetSite(REFIID riid, void **ppvSite) { - if (ppvSite == NULL) - return E_POINTER; - *ppvSite = m_Site; - if (m_Site.p != NULL) - m_Site.p->AddRef(); - return S_OK; + if (m_Site == NULL) + return E_FAIL; + + return m_Site->QueryInterface(riid, ppvSite); } LRESULT CMenuDeskBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) @@ -674,9 +681,9 @@ LRESULT CMenuDeskBar::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHan if (m_Banner != NULL) { - SIZE sz; - ::GetBitmapDimensionEx(m_Banner, &sz); - rc.left += sz.cx; + BITMAP bm; + ::GetObject(m_Banner, sizeof(bm), &bm); + rc.left += bm.bmWidth; } ::SetWindowPos(clientWnd, NULL, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, 0); @@ -773,9 +780,21 @@ LRESULT CMenuDeskBar::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHa ::GetObject(m_Banner, sizeof(bm), &bm); + RECT rc; + if (!GetClientRect(&rc)) + WARN("GetClientRect failed\n"); + + const int bx = bm.bmWidth; + const int by = bm.bmHeight; + const int cx = rc.right; + const int cy = rc.bottom; + TRACE("Painting banner: %d by %d\n", bm.bmWidth, bm.bmHeight); - if (!::BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY)) + if (!::StretchBlt(hdc, 0, 0, bx, cy-by, hdcMem, 0, 0, bx, 1, SRCCOPY)) + WARN("StretchBlt failed\n"); + + if (!::BitBlt(hdc, 0, cy-by, bx, by, hdcMem, 0, 0, SRCCOPY)) WARN("BitBlt failed\n"); ::SelectObject(hdcMem, hbmOld); @@ -789,100 +808,82 @@ LRESULT CMenuDeskBar::OnPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHa HRESULT STDMETHODCALLTYPE CMenuDeskBar::Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags) { - //ENTER >> CMenuDeskBar<03901CC0>::Popup(POINTL *ppt=00B3F428, RECTL *prcExclude=00B3F418, MP_POPUPFLAGS dwFlags=80000000) - // ENTER >> CMenuBand<00D2CCF8>::QueryService - - // ENTER >> CMenuBand<00D2CCF8>::ShowDW(BOOL fShow=1) - // ENTER >> CMenuDeskBar<03901CC0>::GetSite(REFIID riid={4622AD10-FF23-11D0-8D34-00A0C90F2719}, PVOID *ppvSite=03901D4C) - // -- *ppvSite=00BDEA90 - // EXIT <<< CMenuDeskBar::GetSite() = 00000000 - // ENTER >> CMenuBand<00D2CCF8>::SetMenu(HMENU hmenu=593F0A07, HWND hwnd=00000000, DWORD dwFlags=20000000) - // EXIT <<< CMenuBand::SetMenu() = 00000000 - // EXIT <<< CMenuBand::ShowDW() = 00000000 - // ENTER >> CMenuBand<00D2CCF8>::GetBandInfo(DWORD dwBandID=0, DWORD dwViewMode=0, DESKBANDINFO *pdbi=00B3F0F0) - // EXIT <<< CMenuBand::GetBandInfo() = 00000000 - // ENTER >> CMenuBand<00D2CCF8>::QueryService(REFGUID guidService={ED9CC020-08B9-11D1-9823-00C04FD91972}, REFIID riid={B722BCCB-4E68-101B-A2BC-00AA00404770}, void **ppvObject=00B3F304) - // -- SID is SID_SMenuBandChild. Using QueryInterface of self instead of wrapped object. - // -- *ppvObject=00D2CD08 - // EXIT <<< CMenuBand::QueryService() = 00000000 - // ENTER >> CMenuBand<00D2CCF8>::Exec(const GUID *pguidCmdGroup=76BAE1FC, DWORD nCmdID=19, DWORD nCmdexecopt=0, VARIANT *pvaIn=00000000, VARIANT *pvaOut=00000000) - // -- *pguidCmdGroup={5B4DAE26-B807-11D0-9815-00C04FD91972} - // EXIT <<< CMenuBand::Exec() = 00000001 - // ENTER >> CMenuBand<00D2CCF8>::OnPosRectChangeDB(RECT *prc=00B3E630) - // -- *prc={L: 0, T: 0, R: 218, B: 305} - // EXIT <<< CMenuBand::OnPosRectChangeDB() = 00000000 - // ENTER >> CMenuBand<00D2CCF8>::UIActivateIO(BOOL fActivate=1, LPMSG lpMsg=00000000) - // EXIT <<< CMenuBand::UIActivateIO() = 00000001 - //EXIT <<< CMenuDeskBar::Popup() = 00000000 HRESULT hr; - IServiceProvider * sp; - IOleCommandTarget * oct; - IInputObject * io; + CComPtr oct; + CComPtr io; + CComPtr band; + CComPtr dbc; + + if (m_hWnd == NULL) + return E_FAIL; - hr = m_Client->QueryInterface(IID_PPV_ARG(IServiceProvider, &sp)); + hr = IUnknown_QueryService(m_Client, SID_SMenuBandChild, IID_PPV_ARG(IOleCommandTarget, &oct)); if (FAILED(hr)) return hr; - hr = m_Client->QueryInterface(IID_PPV_ARG(IInputObject, &io)); + hr = m_Client->QueryInterface(IID_PPV_ARG(IDeskBarClient, &dbc)); if (FAILED(hr)) return hr; - hr = sp->QueryService(SID_SMenuBandChild, IID_PPV_ARG(IOleCommandTarget, &oct)); + // No clue about the arg, using anything != 0 + hr = dbc->UIActivateDBC(TRUE); + if (FAILED(hr)) + return hr; + + RECT rc = { 0 }; + hr = dbc->GetSize(0, &rc); if (FAILED(hr)) - { - sp->Release(); return hr; - } // Unknown meaning const int CMD = 19; const int CMD_EXEC_OPT = 0; - hr = oct->Exec(&CLSID_MenuBand, CMD, CMD_EXEC_OPT, NULL, NULL); + hr = IUnknown_QueryServiceExec(m_Client, SID_SMenuBandChild, &CLSID_MenuBand, CMD, CMD_EXEC_OPT, NULL, NULL); + if (FAILED(hr)) + return hr; + + ::AdjustWindowRect(&rc, WS_DLGFRAME, FALSE); + rc.right -= rc.left; + rc.bottom -= rc.top; + + int x = ppt->x; + int y = ppt->y - rc.bottom; + int cx = rc.right; + int cy = rc.bottom; - oct->Release(); - sp->Release(); - return hr; + this->SetWindowPos(NULL, x, y, cx, cy, SWP_SHOWWINDOW); + + // HACK: The bar needs to be notified of the size AFTER it is shown. + // Quick & dirty way of getting it done. + BOOL bHandled; + OnSize(WM_SIZE, 0, 0, bHandled); + + hr = m_Client->QueryInterface(IID_PPV_ARG(IInputObject, &io)); + if (FAILED(hr)) + return hr; + + io->UIActivateIO(TRUE, NULL); - // FIXME: everything! - const int hackWidth = 200; - const int hackHeight = 400; - RECT r = { ppt->x, ppt->y - hackHeight, ppt->x + hackWidth, ppt->y }; - if (this->m_hWnd == NULL) - { - this->Create(NULL, &r); - } - this->SetWindowPos(NULL, r.left, r.top, r.right - r.left, r.bottom - r.top, SWP_SHOWWINDOW); return S_OK; } HRESULT STDMETHODCALLTYPE CMenuDeskBar::SetIconSize(THIS_ DWORD iIcon) { HRESULT hr; - IServiceProvider * sp; - IOleCommandTarget * oct; - m_IconSize = iIcon; - hr = m_Client->QueryInterface(IID_PPV_ARG(IServiceProvider, &sp)); - if (FAILED(hr)) - return hr; + // Unknown meaning (set flags? set icon size?) + const int CMD = 16; + const int CMD_EXEC_OPT = iIcon ? 0 : 2; // seems to work - hr = sp->QueryService(SID_SMenuBandChild, IID_PPV_ARG(IOleCommandTarget, &oct)); + hr = IUnknown_QueryServiceExec(m_Client, SID_SMenuBandChild, &CLSID_MenuBand, CMD, CMD_EXEC_OPT, NULL, NULL); if (FAILED(hr)) - { - sp->Release(); return hr; - } - // Unknown meaning - const int CMD = 16; - const int CMD_EXEC_OPT = 2; - - hr = oct->Exec(&CLSID_MenuBand, CMD, CMD_EXEC_OPT, NULL, NULL); + BOOL bHandled; + OnSize(WM_SIZE, 0, 0, bHandled); - oct->Release(); - sp->Release(); return hr; } @@ -896,6 +897,10 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::GetIconSize(THIS_ DWORD* piIcon) HRESULT STDMETHODCALLTYPE CMenuDeskBar::SetBitmap(THIS_ HBITMAP hBitmap) { m_Banner = hBitmap; + + BOOL bHandled; + OnSize(WM_SIZE, 0, 0, bHandled); + return S_OK; } diff --git a/base/shell/rshell/CMenuSite.cpp b/base/shell/rshell/CMenuSite.cpp index 38a03bd84d1..82d864c3c34 100644 --- a/base/shell/rshell/CMenuSite.cpp +++ b/base/shell/rshell/CMenuSite.cpp @@ -73,23 +73,39 @@ public: COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider) END_COM_MAP() - virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); - virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); - virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus); + // IBandSite virtual HRESULT STDMETHODCALLTYPE AddBand(IUnknown * punk); virtual HRESULT STDMETHODCALLTYPE EnumBands(UINT uBand, DWORD* pdwBandID); - virtual HRESULT STDMETHODCALLTYPE Exec(const GUID * pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + virtual HRESULT STDMETHODCALLTYPE QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName); virtual HRESULT STDMETHODCALLTYPE GetBandObject(DWORD dwBandID, REFIID riid, VOID **ppv); + + // IDeskBarClient + virtual HRESULT STDMETHODCALLTYPE SetDeskBarSite(IUnknown *punkSite); virtual HRESULT STDMETHODCALLTYPE GetSize(DWORD dwWhich, LPRECT prc); + virtual HRESULT STDMETHODCALLTYPE UIActivateDBC(DWORD dwState); + + // IOleWindow virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd); + + // IOleCommandTarget + virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID * pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText); + virtual HRESULT STDMETHODCALLTYPE Exec(const GUID * pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut); + + // IInputObject + virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + virtual HRESULT STDMETHODCALLTYPE HasFocusIO(); + virtual HRESULT STDMETHODCALLTYPE TranslateAcceleratorIO(LPMSG lpMsg); + + // IInputObjectSite + virtual HRESULT STDMETHODCALLTYPE OnFocusChangeIS(IUnknown *punkObj, BOOL fSetFocus); + + // IWinEventHandler virtual HRESULT STDMETHODCALLTYPE IsWindowOwner(HWND hWnd); virtual HRESULT STDMETHODCALLTYPE OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult); - virtual HRESULT STDMETHODCALLTYPE QueryBand(DWORD dwBandID, IDeskBand **ppstb, DWORD *pdwState, LPWSTR pszName, int cchName); + + // IServiceProvider virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID guidService, REFIID riid, void **ppvObject); - virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID * pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText); - virtual HRESULT STDMETHODCALLTYPE SetDeskBarSite(IUnknown *punkSite); - virtual HRESULT STDMETHODCALLTYPE UIActivateDBC(DWORD dwState); - virtual HRESULT STDMETHODCALLTYPE UIActivateIO(BOOL fActivate, LPMSG lpMsg); + // Using custom message map instead virtual BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT &lResult, DWORD mapId = 0); @@ -260,6 +276,7 @@ HRESULT STDMETHODCALLTYPE CMenuSite::GetSize(DWORD dwWhich, LPRECT prc) return S_OK; DESKBANDINFO info = { 0 }; + info.dwMask = DBIM_MAXSIZE; m_DeskBand->GetBandInfo(0, 0, &info); diff --git a/include/psdk/shlwapi_undoc.h b/include/psdk/shlwapi_undoc.h index a37237d910b..46d4d0862b8 100644 --- a/include/psdk/shlwapi_undoc.h +++ b/include/psdk/shlwapi_undoc.h @@ -58,6 +58,7 @@ HRESULT WINAPI IUnknown_SetOwner(IUnknown *pUnk, ULONG arg); HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site); HRESULT WINAPI IUnknown_GetClassID(IUnknown *lpUnknown, CLSID *lpClassId); HRESULT WINAPI IUnknown_QueryService(IUnknown* lpUnknown, REFGUID sid, REFIID riid, LPVOID *lppOut); +HRESULT WINAPI IUnknown_QueryServiceExec(IUnknown *lpUnknown, REFIID service, const GUID *group, DWORD cmdId, DWORD cmdOpt, VARIANT *pIn, VARIANT *pOut); HRESULT WINAPI IUnknown_UIActivateIO(IUnknown *unknown, BOOL activate, LPMSG msg); BOOL WINAPI SHLoadMenuPopup(HINSTANCE hInst, LPCWSTR szName); void WINAPI SHPropagateMessage(HWND hWnd, UINT uiMsgId, WPARAM wParam, LPARAM lParam, BOOL bSend);