ReactOS 0.4.16-dev-1142-g8029339
CMenuBand.cpp
Go to the documentation of this file.
1/*
2 * Shell Menu Band
3 *
4 * Copyright 2014 David Quintana
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20#include "shellmenu.h"
21#include <windowsx.h>
22#include <commoncontrols.h>
23#include <shlwapi_undoc.h>
24
25#include "CMenuBand.h"
26#include "CMenuToolbars.h"
27#include "CMenuFocusManager.h"
28
30
31#undef UNIMPLEMENTED
32
33#define UNIMPLEMENTED TRACE("%s is UNIMPLEMENTED!\n", __FUNCTION__)
34
36 m_staticToolbar(NULL),
37 m_SFToolbar(NULL),
38 m_site(NULL),
39 m_psmc(NULL),
40 m_subMenuChild(NULL),
41 m_subMenuParent(NULL),
42 m_childBand(NULL),
43 m_parentBand(NULL),
44 m_hmenu(NULL),
45 m_menuOwner(NULL),
46 m_useBigIcons(FALSE),
47 m_topLevelWindow(NULL),
48 m_hotBar(NULL),
49 m_hotItem(-1),
50 m_popupBar(NULL),
51 m_popupItem(-1),
52 m_Show(FALSE),
53 m_shellBottom(FALSE),
54 m_trackedPopup(NULL),
55 m_trackedHwnd(NULL)
56{
58}
59
61{
63
64 delete m_staticToolbar;
65 delete m_SFToolbar;
66
67 if (m_hmenu)
69}
70
73 UINT uId,
74 UINT uIdAncestor,
76{
77 if (m_psmc != psmc)
78 m_psmc = psmc;
79 m_uId = uId;
80 m_uIdAncestor = uIdAncestor;
82
83 if (m_psmc)
84 {
85 _CallCB(SMC_CREATE, 0, reinterpret_cast<LPARAM>(&m_UserData));
86 }
87
88 return S_OK;
89}
90
92 IShellMenuCallback **ppsmc,
93 UINT *puId,
94 UINT *puIdAncestor,
95 DWORD *pdwFlags)
96{
97 if (!pdwFlags) // maybe?
98 return E_INVALIDARG;
99
100 if (ppsmc)
101 {
102 *ppsmc = m_psmc;
103 if (*ppsmc)
104 (*ppsmc)->AddRef();
105 }
106
107 if (puId)
108 *puId = m_uId;
109
110 if (puIdAncestor)
111 *puIdAncestor = m_uIdAncestor;
112
113 *pdwFlags = m_dwFlags;
114
115 return S_OK;
116}
117
119 HMENU hmenu,
120 HWND hwnd,
122{
123 HRESULT hr;
124
125 TRACE("CMenuBand::SetMenu called, hmenu=%p; hwnd=%p, flags=%x\n", hmenu, hwnd, dwFlags);
126
127 BOOL created = FALSE;
128
129 if (m_hmenu && m_hmenu != hmenu)
130 {
132 m_hmenu = NULL;
133 }
134
135 m_hmenu = hmenu;
137
138 if (m_hmenu && m_staticToolbar == NULL)
139 {
141 created = true;
142 }
143
144 if (m_staticToolbar)
145 {
148 return hr;
149 }
150
151 if (m_site)
152 {
154
155 hr = m_site->GetWindow(&hwndParent);
157 return hr;
158
159 if (created)
160 {
163 return hr;
164
166 }
167 else
168 {
170 }
171 }
172
173 return hr;
174}
175
177 HMENU *phmenu,
178 HWND *phwnd,
179 DWORD *pdwFlags)
180{
181 if (m_staticToolbar == NULL)
182 return E_FAIL;
183
184 return m_staticToolbar->GetMenu(phmenu, phwnd, pdwFlags);
185}
186
188{
190 HRESULT hr;
191
192 m_site = NULL;
193
194 if (pUnkSite == NULL)
195 return S_OK;
196
200 return hr;
201
202 hr = m_site->GetWindow(&hwndParent);
204 return hr;
205
207 return E_FAIL;
208
209 if (m_staticToolbar != NULL)
210 {
213 return hr;
214
217 return hr;
218 }
219
220 if (m_SFToolbar != NULL)
221 {
224 return hr;
225
228 return hr;
229 }
230
233 return hr;
234
235 CComPtr<IOleWindow> pTopLevelWindow;
236 hr = IUnknown_QueryService(m_site, SID_STopLevelBrowser, IID_PPV_ARG(IOleWindow, &pTopLevelWindow));
237 if (SUCCEEDED(hr))
238 {
239 hr = pTopLevelWindow->GetWindow(&m_topLevelWindow);
241 return hr;
242 }
243 else
244 {
246 }
247
248 return S_OK;
249}
250
252{
253 if (m_site == NULL)
254 return E_FAIL;
255
256 return m_site->QueryInterface(riid, ppvSite);
257}
258
260{
261 if (m_SFToolbar != NULL)
262 return m_SFToolbar->GetWindow(phwnd);
263
264 if (m_staticToolbar != NULL)
265 return m_staticToolbar->GetWindow(phwnd);
266
267 if (phwnd) *phwnd = NULL;
268
269 return E_FAIL;
270}
271
273{
274 SIZE maxStatic = { 0 };
275 SIZE maxShlFld = { 0 };
276 HRESULT hr = S_OK;
277
278 if (m_staticToolbar != NULL)
279 hr = m_staticToolbar->GetSizes(NULL, &maxStatic, NULL);
281 return hr;
282
283 if (m_SFToolbar != NULL)
284 hr = m_SFToolbar->GetSizes(NULL, &maxShlFld, NULL);
286 return hr;
287
289 return E_FAIL;
290
291 int sy = min(prc->bottom - prc->top, maxStatic.cy + maxShlFld.cy);
292
293 int syStatic = maxStatic.cy;
294 int syShlFld = sy - syStatic;
295
296 // TODO: Windows has a more complex system to decide ordering.
297 // Because we only support two toolbars at once, this is enough for us.
298 if (m_shellBottom)
299 {
300 // Static menu on top
301 if (m_SFToolbar)
302 {
304 prc->left,
305 prc->top + syStatic,
306 prc->right - prc->left,
307 syShlFld);
308 }
309 if (m_staticToolbar)
310 {
312 prc->left,
313 prc->top,
314 prc->right - prc->left,
315 syStatic);
316 }
317 }
318 else
319 {
320 // Folder menu on top
321 if (m_SFToolbar)
322 {
324 prc->left,
325 prc->top,
326 prc->right - prc->left,
327 syShlFld);
328 }
329 if (m_staticToolbar)
330 {
332 prc->left,
333 prc->top + syShlFld,
334 prc->right - prc->left,
335 syStatic);
336 }
337 }
338
339 return S_OK;
340}
341
343 DWORD dwBandID,
344 DWORD dwViewMode,
345 DESKBANDINFO *pdbi)
346{
347 SIZE minStatic = { 0 };
348 SIZE minShlFld = { 0 };
349 SIZE maxStatic = { 0 };
350 SIZE maxShlFld = { 0 };
351 SIZE intStatic = { 0 };
352 SIZE intShlFld = { 0 };
353
354 HRESULT hr = S_OK;
355
356 if (m_staticToolbar != NULL)
357 hr = m_staticToolbar->GetSizes(&minStatic, &maxStatic, &intStatic);
359 return hr;
360
361 if (m_SFToolbar != NULL)
362 hr = m_SFToolbar->GetSizes(&minShlFld, &maxShlFld, &intShlFld);
364 return hr;
365
367 return E_FAIL;
368
369 if (m_dwFlags & SMINIT_VERTICAL)
370 {
371 pdbi->ptMinSize.x = max(minStatic.cx, minShlFld.cx) + 20;
372 pdbi->ptMinSize.y = minStatic.cy + minShlFld.cy;
373 pdbi->ptMaxSize.x = max(maxStatic.cx, maxShlFld.cx) + 20;
374 pdbi->ptMaxSize.y = maxStatic.cy + maxShlFld.cy;
375 pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT;
376 }
377 else
378 {
379 pdbi->ptMinSize.x = minStatic.cx + minShlFld.cx;
380 pdbi->ptMinSize.y = max(minStatic.cy, minShlFld.cy);
381 pdbi->ptMaxSize.x = maxStatic.cx + maxShlFld.cx;
382 pdbi->ptMaxSize.y = max(maxStatic.cy, maxShlFld.cy);
383 }
384 pdbi->ptIntegral.x = max(intStatic.cx, intShlFld.cx);
385 pdbi->ptIntegral.y = max(intStatic.cy, intShlFld.cy);
386 pdbi->ptActual = pdbi->ptMinSize;
387
388 return S_OK;
389}
390
392{
393 HRESULT hr = S_OK;
394
395 if (m_Show == fShow)
396 return S_OK;
397
398 m_Show = fShow;
399
400 if (m_staticToolbar != NULL)
401 {
402 hr = m_staticToolbar->ShowDW(fShow);
404 return hr;
405 }
406
407 if (m_SFToolbar != NULL)
408 {
409 hr = m_SFToolbar->ShowDW(fShow);
411 return hr;
412 }
413
414 if (fShow)
415 {
416 hr = _CallCB(SMC_INITMENU, 0, 0);
418 return hr;
419 }
420 else if (m_parentBand)
421 {
422 m_parentBand->SetClient(NULL);
423 }
424
425 if (_IsPopup() == S_OK)
426 {
427 if (fShow)
429 else
431 }
432 else
433 {
434 if (fShow)
436 else
438 }
439
440 return S_OK;
441}
442
444{
445 if (m_subMenuChild)
446 {
448 }
449
450 if (m_subMenuChild)
451 {
452 TRACE("Child object should have removed itself.\n");
453 }
454
455 ShowDW(FALSE);
456
457 if (m_staticToolbar != NULL)
458 {
460 }
461
462 if (m_SFToolbar != NULL)
463 {
465 }
466
467 if (m_site) m_site.Release();
470 if (m_childBand) m_childBand.Release();
471 if (m_parentBand) m_parentBand.Release();
472
473 return S_OK;
474}
475
477{
478 HRESULT hr;
479
480 if (m_subMenuParent)
481 {
482 hr = m_subMenuParent->SetSubMenu(this, fActivate);
484 return hr;
485 }
486
487 if (fActivate)
488 {
489 CComPtr<IOleWindow> pTopLevelWindow;
490 hr = IUnknown_QueryService(m_site, SID_SMenuPopup, IID_PPV_ARG(IOleWindow, &pTopLevelWindow));
492 return hr;
493
494 hr = pTopLevelWindow->GetWindow(&m_topLevelWindow);
496 return hr;
497 }
498 else
499 {
501 }
502
503 return S_FALSE;
504}
505
506HRESULT STDMETHODCALLTYPE CMenuBand::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut)
507{
508 if (!pguidCmdGroup)
509 return E_FAIL;
510
511 if (IsEqualGUID(*pguidCmdGroup, CLSID_MenuBand))
512 {
513 if (nCmdID == 16) // set (big) icon size
514 {
515 this->m_useBigIcons = nCmdexecopt == 2;
516 return S_OK;
517 }
518 else if (nCmdID == 19) // popup-related
519 {
520 return S_FALSE;
521 }
522 else if (nCmdID == 5) // select an item
523 {
524 if (nCmdexecopt == 0) // first
525 {
527 }
528 else // last
529 {
531 }
532 return S_FALSE;
533 }
534
535 return S_FALSE;
536 }
537
539 return S_OK;
540}
541
543{
544 if (IsEqualIID(guidService, SID_SMenuBandChild) ||
545 IsEqualIID(guidService, SID_SMenuBandBottom) ||
546 IsEqualIID(guidService, SID_SMenuBandBottomSelected))
547 return this->QueryInterface(riid, ppvObject);
548 WARN("Unknown service requested %s\n", wine_dbgstr_guid(&guidService));
549 return E_NOINTERFACE;
550}
551
553{
555 return S_OK;
556}
557
559{
560 // When called from outside, this is straightforward:
561 // Things that a submenu needs to know, are spread down, and
562 // things that the parent needs to know, are spread up. No drama.
563 // The fun is in _MenuItemSelect (internal method).
564 switch (dwSelectType)
565 {
567 if (!m_subMenuParent)
568 break;
569 // TODO: Cancel timers?
570 return m_subMenuParent->OnSelect(dwSelectType);
571 case MPOS_SELECTLEFT:
572 if (m_subMenuChild)
574 if (!m_subMenuParent)
575 break;
576 return m_subMenuParent->OnSelect(dwSelectType);
577 case MPOS_SELECTRIGHT:
578 if (!m_subMenuParent)
579 break;
580 return m_subMenuParent->OnSelect(dwSelectType);
581 case MPOS_EXECUTE:
582 case MPOS_FULLCANCEL:
583 if (m_subMenuChild)
584 m_subMenuChild->OnSelect(dwSelectType);
585 if (!m_subMenuParent)
586 break;
587 return m_subMenuParent->OnSelect(dwSelectType);
588 case MPOS_CANCELLEVEL:
589 if (m_subMenuChild)
590 m_subMenuChild->OnSelect(dwSelectType);
591 // Deselect the currently selected item
592 _ChangeHotItem(NULL, -1, 0);
593 break;
594 }
595 return S_FALSE;
596}
597
599{
601 return S_OK;
602}
603
604// Used by the focus manager to update the child band pointer
606{
608 if (!child)
609 {
611 }
612 return S_OK;
613}
614
615// User by the focus manager to update the parent band pointer
617{
619 return S_OK;
620}
621
623{
624 return !(m_dwFlags & SMINIT_VERTICAL);
625}
626
628{
629 return m_popupBar != NULL;
630}
631
633{
634 CComPtr<IMenuPopup> child = m_subMenuChild;
635
637
638 if (child)
639 {
641 child.Release();
642 }
643
644 if (!punkClient)
645 {
646 return S_OK;
647 }
648
650}
651
653{
654 if (!ppunkClient)
655 return E_POINTER;
656 *ppunkClient = NULL;
657
658 if (m_subMenuChild)
659 {
660 *ppunkClient = m_subMenuChild;
661 (*ppunkClient)->AddRef();
662 }
663
664 return S_OK;
665}
666
668{
669 return S_FALSE;
670}
671
673{
674 if (pmsg->message == WM_ACTIVATE && _IsPopup() == S_FALSE)
675 {
676 if (m_staticToolbar)
677 m_staticToolbar->Invalidate();
678 if (m_SFToolbar)
679 m_SFToolbar->Invalidate();
680 }
681
682 return S_FALSE;
683}
684
686{
687 if (!psf)
688 return E_INVALIDARG;
689
690 if (m_SFToolbar == NULL)
691 {
692 m_SFToolbar = new CMenuSFToolbar(this);
693 }
694
695 HRESULT hr = m_SFToolbar->SetShellFolder(psf, pidlFolder, hKey, dwFlags);
697 return hr;
698
699 m_shellBottom = (dwFlags & SMSET_BOTTOM) != 0;
700
701 if (m_site)
702 {
704
705 hr = m_site->GetWindow(&hwndParent);
707 return hr;
708
711 return hr;
712
714 }
715
716 return hr;
717}
718
720{
721 if (m_SFToolbar)
722 return m_SFToolbar->GetShellFolder(pdwFlags, ppidl, riid, ppv);
723 return E_FAIL;
724}
725
727{
728 if (theResult)
729 *theResult = 0;
730
731 if (uMsg == WM_WININICHANGE && wParam == SPI_SETFLATMENU)
732 {
733 BOOL bFlatMenus;
734 SystemParametersInfo(SPI_GETFLATMENU, 0, &bFlatMenus, 0);
735 AdjustForTheme(bFlatMenus);
736
737 if (m_staticToolbar)
738 m_staticToolbar->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult);
739
740 if (m_SFToolbar)
741 m_SFToolbar->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult);
742
743 return S_OK;
744 }
745
747 {
748 return m_staticToolbar->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult);
749 }
750
752 {
753 return m_SFToolbar->OnWinEvent(hWnd, uMsg, wParam, lParam, theResult);
754 }
755
756 return S_FALSE;
757}
758
760{
762 return S_OK;
763
765 return S_OK;
766
767 return S_FALSE;
768}
769
771{
772 return _CallCB(uMsg, wParam, lParam, id);
773}
774
776{
777 return _CallCB(uMsg, wParam, lParam, 0, pidl);
778}
779
781{
782 if (!m_psmc)
783 return S_FALSE;
784
785 SMDATA smData = { 0 };
786 smData.punk = static_cast<IShellMenu2*>(this);
787 smData.uId = id;
788 smData.uIdParent = m_uId;
789 smData.uIdAncestor = m_uIdAncestor;
790 smData.pidlItem = pidl;
792 smData.hmenu = m_hmenu;
793 if (m_SFToolbar)
795 HRESULT hr = m_psmc->CallbackSM(&smData, uMsg, wParam, lParam);
796 ILFree(smData.pidlFolder);
797 if (smData.psf)
798 smData.psf->Release();
799 return hr;
800}
801
803{
804 TPMPARAMS params = { sizeof(TPMPARAMS), rcExclude };
805 UINT flags = TPM_VERPOSANIMATION | TPM_VERTICAL | TPM_LEFTALIGN;
807
808 m_trackedPopup = popup;
810
812 ::TrackPopupMenuEx(popup, flags, x, y, hwnd, &params);
814
817
819
820 return S_OK;
821}
822
824{
825 HRESULT hr;
826 UINT uCommand;
827
828 // Ensure that the menu doesn't disappear on us
829 CComPtr<IContextMenu> ctxMenu = contextMenu;
830
831 HMENU popup = CreatePopupMenu();
832
833 if (popup == NULL)
834 return E_FAIL;
835
836 TRACE("Before Query\n");
837 UINT cmf = CMF_NORMAL;
838 if (GetKeyState(VK_SHIFT) < 0)
839 cmf |= CMF_EXTENDEDVERBS;
840
841 const UINT idCmdFirst = 100, idCmdLast = 0xffff;
842 hr = contextMenu->QueryContextMenu(popup, 0, idCmdFirst, idCmdLast, cmf);
844 {
845 TRACE("Query failed\n");
846 DestroyMenu(popup);
847 return hr;
848 }
849
851
853
854 TRACE("Before Tracking\n");
855 uCommand = ::TrackPopupMenuEx(popup, TPM_RETURNCMD, x, y, hwnd, NULL);
856
858
859 if (uCommand != 0)
860 {
862
863 TRACE("Before InvokeCommand\n");
864 // Note: Not passing hwnd to InvokeCommand because it can be a BaseBar window that is about to die
865 CMINVOKECOMMANDINFO cmi = { sizeof(cmi), 0, NULL };
866 cmi.lpVerb = MAKEINTRESOURCEA(uCommand - idCmdFirst);
867 if (GetKeyState(VK_SHIFT) < 0)
868 cmi.fMask |= CMIC_MASK_SHIFT_DOWN;
869 if (GetKeyState(VK_CONTROL) < 0)
870 cmi.fMask |= CMIC_MASK_CONTROL_DOWN;
871 cmi.nShow = SW_SHOW;
872 hr = contextMenu->InvokeCommand(&cmi);
873 TRACE("InvokeCommand returned hr=%08x\n", hr);
874 }
875 else
876 {
877 TRACE("TrackPopupMenu failed. Code=%d, LastError=%d\n", uCommand, GetLastError());
878 hr = S_FALSE;
879 }
880
881 DestroyMenu(popup);
882 return hr;
883}
884
886{
887 *topLevel = m_topLevelWindow;
888 return S_OK;
889}
890
892{
893 if (m_hotBar == tb && m_hotItem == id)
894 return S_FALSE;
895
896 TRACE("Hot item changed from %p %p, to %p %p\n", m_hotBar, m_hotItem, tb, id);
897
899
900 m_hotBar = tb;
901 m_hotItem = id;
904
906
907 return S_OK;
908}
909
911{
912 TRACE("Popup item changed from %p %p, to %p %p\n", m_popupBar, m_popupItem, tb, id);
913
914 m_popupBar = tb;
915 m_popupItem = id;
918
919 return S_OK;
920}
921
923{
924 HRESULT hr;
926
927 if (!tb)
928 {
929 // If no hot item was selected choose the appropriate toolbar
930 if (change == VK_UP || change == VK_END)
931 {
932 if (m_staticToolbar)
934 else
935 tb = m_SFToolbar;
936 }
937 else if (change == VK_DOWN || change == VK_HOME)
938 {
939 if (m_SFToolbar)
940 tb = m_SFToolbar;
941 else
943 }
944 }
945
946 // Ask the first toolbar to change
947 hr = tb->KeyboardItemChange(change);
948
949 if (hr != S_FALSE)
950 return hr;
951
952 // Select the second toolbar based on the first
955 else if (m_SFToolbar)
956 tb = m_SFToolbar;
957
958 if (!tb)
959 return hr;
960
961 // Ask the second toolbar to change
962 return tb->KeyboardItemChange(change == VK_DOWN ? VK_HOME : VK_END);
963}
964
966{
967 // Needed to prevent the this point from vanishing mid-function
968 CComPtr<CMenuBand> safeThis = this;
969 HRESULT hr;
970
971 if (m_dwFlags & SMINIT_VERTICAL)
972 {
973 switch (changeType)
974 {
975 case VK_UP:
976 case VK_DOWN:
977 return _KeyboardItemChange(changeType);
978
979 // TODO: Left/Right across multi-column menus, if they ever work.
980 case VK_LEFT:
981 changeType = MPOS_SELECTLEFT;
982 break;
983 case VK_RIGHT:
984 changeType = MPOS_SELECTRIGHT;
985 break;
986 }
987 }
988 else
989 {
990 // In horizontal menubars, left/right are equivalent to vertical's up/down
991 switch (changeType)
992 {
993 case VK_LEFT:
995 if (hr != S_FALSE)
996 return hr;
997 case VK_RIGHT:
999 if (hr != S_FALSE)
1000 return hr;
1001 }
1002 }
1003
1004 // In this context, the parent is the CMenuDeskBar, so when it bubbles upward,
1005 // it is notifying the deskbar, and not the the higher-level menu.
1006 // Same for the child: since it points to a CMenuDeskBar, it's not just recursing.
1007 switch (changeType)
1008 {
1009 case MPOS_EXECUTE:
1010 {
1012 int item = m_hotItem;
1013 tb->PrepareExecuteItem(item);
1014 if (m_subMenuParent)
1015 {
1016 m_subMenuParent->OnSelect(changeType);
1017 }
1018 TRACE("Menu closed, executing item...\n");
1019 tb->ExecuteItem();
1020 break;
1021 }
1022 case MPOS_SELECTLEFT:
1023 if (m_parentBand && m_parentBand->_IsPopup()==S_FALSE)
1024 return m_parentBand->_MenuItemSelect(VK_LEFT);
1025 if (m_subMenuChild)
1026 return m_subMenuChild->OnSelect(MPOS_CANCELLEVEL);
1027 if (!m_subMenuParent)
1028 return S_OK;
1029 return m_subMenuParent->OnSelect(MPOS_CANCELLEVEL);
1030
1031 case MPOS_SELECTRIGHT:
1032 if (m_hotBar && m_hotItem >= 0 && m_hotBar->PopupItem(m_hotItem, TRUE) == S_OK)
1033 return S_FALSE;
1034 if (m_parentBand)
1035 return m_parentBand->_MenuItemSelect(VK_RIGHT);
1036 if (!m_subMenuParent)
1037 return S_OK;
1038 return m_subMenuParent->OnSelect(MPOS_SELECTRIGHT);
1039
1040 default:
1041 if (!m_subMenuParent)
1042 return S_OK;
1043 return m_subMenuParent->OnSelect(changeType);
1044 }
1045
1046 return S_OK;
1047}
1048
1050{
1051 if (m_subMenuChild)
1052 {
1054 return hr;
1055 }
1056
1057 if (m_trackedPopup)
1058 {
1060 return S_OK;
1061 }
1062
1063 return S_FALSE;
1064}
1065
1066HRESULT CMenuBand::_OnPopupSubMenu(IShellMenu * childShellMenu, POINTL * pAt, RECTL * pExclude, BOOL keyInitiated)
1067{
1068 HRESULT hr = 0;
1069 CComPtr<IBandSite> pBandSite;
1070 CComPtr<IDeskBar> pDeskBar;
1071
1072 // Create the necessary objects
1075 return hr;
1076
1079 return hr;
1080
1081 hr = pDeskBar->SetClient(pBandSite);
1083 return hr;
1084
1085 hr = pBandSite->AddBand(childShellMenu);
1087 return hr;
1088
1089 //
1090 CComPtr<IMenuPopup> popup;
1091 hr = pDeskBar->QueryInterface(IID_PPV_ARG(IMenuPopup, &popup));
1093 return hr;
1094
1095 m_subMenuChild = popup;
1096
1097 if (m_subMenuParent)
1099 else
1100 IUnknown_SetSite(popup, m_site);
1101
1103
1104 if (keyInitiated && m_dwFlags & SMINIT_VERTICAL)
1106
1107 popup->Popup(pAt, pExclude, flags);
1108
1109 return S_OK;
1110}
1111
1113{
1114 if (m_staticToolbar)
1116 if (m_SFToolbar)
1118 return S_OK;
1119}
1120
1122{
1123 if (m_staticToolbar)
1125 if (m_SFToolbar)
1126 m_SFToolbar->DisableMouseTrack(bDisable);
1127 return S_OK;
1128}
1129
1131{
1132 HRESULT hr = S_OK;
1133 if (m_staticToolbar)
1135 if (FAILED(hr))
1136 return hr;
1137
1138 if (m_SFToolbar)
1140
1141 return hr;
1142}
1143
1145{
1149 m_SFToolbar->MenuBarMouseDown(item, isLButton);
1150 return S_OK;
1151}
1152
1154{
1156 m_staticToolbar->MenuBarMouseUp(item, isLButton);
1158 m_SFToolbar->MenuBarMouseUp(item, isLButton);
1159 return S_OK;
1160}
1161
1163{
1164 return m_popupBar ? S_OK : S_FALSE;
1165}
1166
1168{
1169 return IUnknown_QueryServiceExec(m_site, SID_SMenuPopup, &CGID_MenuDeskBar, 4, bFlatStyle, NULL, NULL);
1170}
1171
1173{
1175 return S_OK;
1176}
1177
1179{
1181 return S_OK;
1182}
1183
1185{
1187 return S_OK;
1188}
1189
1191{
1193 return S_OK;
1194}
1195
1197{
1199 return S_OK;
1200}
1201
1203{
1205 return S_OK;
1206}
1207
1209{
1211 return S_OK;
1212}
1213
1215{
1217 return S_OK;
1218}
1219
1221{
1223 return S_OK;
1224}
1225
1227{
1229 return S_OK;
1230}
1231
1233{
1235 return S_OK;
1236}
1237
1239{
1241 return S_OK;
1242}
1243
1245{
1247 return S_OK;
1248}
1249
1251{
1253 return S_OK;
1254}
1255
1257{
1259 return S_OK;
1260}
1261
1263{
1265 return S_OK;
1266}
1267
1269{
1271 return S_OK;
1272}
1273
1275{
1276 if (m_popupBar)
1277 return S_OK;
1278 return S_FALSE;
1279}
1280
1282{
1283 // TODO: Alt down -> toggle menu focus
1284 return S_FALSE;
1285}
1286
1288{
1290 return S_OK;
1291}
1292
1294{
1296 return S_OK;
1297}
1298
1300{
1302 return S_OK;
1303}
1304
1306{
1308 return S_OK;
1309}
1310
1312{
1314 return S_OK;
1315}
1316
1317HRESULT STDMETHODCALLTYPE CMenuBand::QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds [], OLECMDTEXT *pCmdText)
1318{
1320 return S_OK;
1321}
1322
1323extern "C"
1325{
1326 return ShellObjectCreator<CMenuBand>(riid, ppv);
1327}
HRESULT WINAPI RSHELL_CMenuBand_CreateInstance(REFIID riid, LPVOID *ppv)
Definition: CMenuBand.cpp:1324
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define WARN(fmt,...)
Definition: precomp.h:61
#define THIS
Definition: basetyps.h:66
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
void Release()
Definition: atlcomcli.h:170
HRESULT _CallCBWithItemPidl(LPITEMIDLIST pidl, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CMenuBand.cpp:775
STDMETHOD() InvalidateItem(LPSMDATA psmd, DWORD dwFlags) override
Definition: CMenuBand.cpp:1172
STDMETHOD() SetMinWidth(THIS) override
Definition: CMenuBand.cpp:1214
STDMETHOD() Popup(POINTL *ppt, RECTL *prcExclude, MP_POPUPFLAGS dwFlags) override
Definition: CMenuBand.cpp:552
HRESULT _IsPopup()
Definition: CMenuBand.cpp:622
STDMETHOD() UIActivateIO(BOOL fActivate, LPMSG lpMsg) override
Definition: CMenuBand.cpp:476
STDMETHOD() OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult) override
Definition: CMenuBand.cpp:726
STDMETHOD() IsWindowOwner(HWND hWnd) override
Definition: CMenuBand.cpp:759
STDMETHOD() OnSelect(DWORD dwSelectType) override
Definition: CMenuBand.cpp:558
HRESULT _OnPopupSubMenu(IShellMenu *childShellMenu, POINTL *pAt, RECTL *pExclude, BOOL mouseInitiated)
Definition: CMenuBand.cpp:1066
STDMETHOD() Initialize(IShellMenuCallback *psmc, UINT uId, UINT uIdAncestor, DWORD dwFlags) override
Definition: CMenuBand.cpp:71
HWND m_trackedHwnd
Definition: CMenuBand.h:73
HRESULT _GetTopLevelWindow(HWND *topLevel)
Definition: CMenuBand.cpp:885
STDMETHOD() DoDefaultAction(THIS) override
Definition: CMenuBand.cpp:1262
STDMETHOD() GetSubMenu(THIS) override
Definition: CMenuBand.cpp:1202
STDMETHOD() HasFocusIO() override
Definition: CMenuBand.cpp:1274
STDMETHOD() SetClient(IUnknown *punkClient) override
Definition: CMenuBand.cpp:632
STDMETHOD() GetSizeMax(ULARGE_INTEGER *pcbSize) override
Definition: CMenuBand.cpp:1305
CMenuSFToolbar * m_SFToolbar
Definition: CMenuBand.h:45
CMenuFocusManager * m_focusManager
Definition: CMenuBand.h:43
HRESULT _TrackContextMenu(IContextMenu *popup, INT x, INT y)
Definition: CMenuBand.cpp:823
HRESULT _TrackSubMenu(HMENU popup, INT x, INT y, RECT &rcExclude)
Definition: CMenuBand.cpp:802
STDMETHOD() QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT *pCmdText) override
Definition: CMenuBand.cpp:1317
STDMETHOD() TranslateMenuMessage(MSG *pmsg, LRESULT *plRet) override
Definition: CMenuBand.cpp:672
STDMETHOD() QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override
Definition: CMenuBand.cpp:542
PVOID m_UserData
Definition: CMenuBand.h:57
UINT m_uIdAncestor
Definition: CMenuBand.h:55
CMenuToolbarBase * m_popupBar
Definition: CMenuBand.h:66
STDMETHOD() GetSite(REFIID riid, PVOID *ppvSite) override
Definition: CMenuBand.cpp:251
STDMETHOD() ShowDW(BOOL fShow) override
Definition: CMenuBand.cpp:391
STDMETHOD() TranslateAcceleratorIO(LPMSG lpMsg) override
Definition: CMenuBand.cpp:1281
HRESULT _DisableMouseTrack(BOOL bDisable)
Definition: CMenuBand.cpp:1121
CComPtr< IMenuPopup > m_subMenuChild
Definition: CMenuBand.h:49
HRESULT _KillPopupTimers()
Definition: CMenuBand.cpp:1130
STDMETHOD() GetTop(THIS) override
Definition: CMenuBand.cpp:1232
HRESULT _MenuItemSelect(DWORD changeType)
Definition: CMenuBand.cpp:965
HWND m_menuOwner
Definition: CMenuBand.h:59
HRESULT _MenuBarMouseUp(HWND hwnd, INT item, BOOL isLButton)
Definition: CMenuBand.cpp:1153
STDMETHOD() GetParentSite(THIS) override
Definition: CMenuBand.cpp:1250
CComPtr< IOleWindow > m_site
Definition: CMenuBand.h:47
BOOL m_Show
Definition: CMenuBand.h:69
HRESULT _SetParentBand(CMenuBand *parent)
Definition: CMenuBand.cpp:616
UINT m_uId
Definition: CMenuBand.h:54
STDMETHOD() SetToolbar(THIS) override
Definition: CMenuBand.cpp:1208
STDMETHOD() SetTheme(THIS) override
Definition: CMenuBand.cpp:1226
DWORD m_dwFlags
Definition: CMenuBand.h:56
STDMETHOD() ResizeBorderDW(LPCRECT prcBorder, IUnknown *punkToolbarSite, BOOL fReserved) override
Definition: CMenuBand.cpp:1190
CComPtr< CMenuBand > m_childBand
Definition: CMenuBand.h:51
STDMETHOD() GetClassID(CLSID *pClassID) override
Definition: CMenuBand.cpp:1311
CComPtr< CMenuBand > m_parentBand
Definition: CMenuBand.h:52
HRESULT _CancelCurrentPopup()
Definition: CMenuBand.cpp:1049
STDMETHOD() SetSite(IUnknown *pUnkSite) override
Definition: CMenuBand.cpp:187
HMENU m_trackedPopup
Definition: CMenuBand.h:72
HRESULT _CallCBWithItemId(UINT Id, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CMenuBand.cpp:770
STDMETHOD() SetNoBorder(THIS) override
Definition: CMenuBand.cpp:1220
STDMETHOD() OnPosRectChangeDB(RECT *prc) override
Definition: CMenuBand.cpp:272
STDMETHOD() CloseDW(DWORD dwReserved) override
Definition: CMenuBand.cpp:443
CComPtr< IShellMenuCallback > m_psmc
Definition: CMenuBand.h:48
STDMETHOD() GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags) override
Definition: CMenuBand.cpp:176
HMENU m_hmenu
Definition: CMenuBand.h:58
HRESULT _KeyboardItemChange(DWORD change)
Definition: CMenuBand.cpp:922
INT m_hotItem
Definition: CMenuBand.h:65
STDMETHOD() GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO *pdbi) override
Definition: CMenuBand.cpp:342
HRESULT _ChangeHotItem(CMenuToolbarBase *tb, INT id, DWORD dwFlags)
Definition: CMenuBand.cpp:891
HWND m_topLevelWindow
Definition: CMenuBand.h:62
HRESULT _CallCB(UINT uMsg, WPARAM wParam, LPARAM lParam, UINT id=0, LPITEMIDLIST pidl=NULL)
Definition: CMenuBand.cpp:780
STDMETHOD() ContextSensitiveHelp(BOOL fEnterMode) override
Definition: CMenuBand.cpp:1196
STDMETHOD() SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags) override
Definition: CMenuBand.cpp:685
STDMETHOD() SetSubMenu(IMenuPopup *pmp, BOOL fSet) override
Definition: CMenuBand.cpp:598
STDMETHOD() IsEmpty(THIS) override
Definition: CMenuBand.cpp:1268
STDMETHOD() Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT *pvaIn, VARIANT *pvaOut) override
Definition: CMenuBand.cpp:506
HRESULT _SetChildBand(CMenuBand *child)
Definition: CMenuBand.cpp:605
STDMETHOD() SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags) override
Definition: CMenuBand.cpp:118
HRESULT AdjustForTheme(BOOL bFlatStyle)
Definition: CMenuBand.cpp:1167
HRESULT _IsTracking()
Definition: CMenuBand.cpp:627
CComPtr< IMenuPopup > m_subMenuParent
Definition: CMenuBand.h:50
STDMETHOD() GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv) override
Definition: CMenuBand.cpp:719
STDMETHOD() GetBottom(THIS) override
Definition: CMenuBand.cpp:1238
HRESULT _MenuBarMouseDown(HWND hwnd, INT item, BOOL isLButton)
Definition: CMenuBand.cpp:1144
STDMETHOD() GetTracked(THIS) override
Definition: CMenuBand.cpp:1244
HRESULT _HasSubMenu()
Definition: CMenuBand.cpp:1162
STDMETHOD() Save(IStream *pStm, BOOL fClearDirty) override
Definition: CMenuBand.cpp:1299
STDMETHOD() GetClient(IUnknown **ppunkClient) override
Definition: CMenuBand.cpp:652
INT m_popupItem
Definition: CMenuBand.h:67
STDMETHOD() GetState(LPSMDATA psmd) override
Definition: CMenuBand.cpp:1178
CMenuToolbarBase * m_hotBar
Definition: CMenuBand.h:64
CMenuStaticToolbar * m_staticToolbar
Definition: CMenuBand.h:44
BOOL m_shellBottom
Definition: CMenuBand.h:70
STDMETHOD() GetWindow(HWND *phwnd) override
Definition: CMenuBand.cpp:259
BOOL m_useBigIcons
Definition: CMenuBand.h:61
STDMETHOD() IsMenuMessage(MSG *pmsg) override
Definition: CMenuBand.cpp:667
HRESULT _ChangePopupItem(CMenuToolbarBase *tb, INT id)
Definition: CMenuBand.cpp:910
STDMETHOD() Load(IStream *pStm) override
Definition: CMenuBand.cpp:1293
STDMETHOD() GetMenuInfo(IShellMenuCallback **ppsmc, UINT *puId, UINT *puIdAncestor, DWORD *pdwFlags) override
Definition: CMenuBand.cpp:91
virtual ~CMenuBand()
Definition: CMenuBand.cpp:60
STDMETHOD() SetMenuToolbar(IUnknown *punk, DWORD dwFlags) override
Definition: CMenuBand.cpp:1184
STDMETHOD() IsDirty() override
Definition: CMenuBand.cpp:1287
HRESULT _BeforeCancelPopup()
Definition: CMenuBand.cpp:1112
static CMenuFocusManager * AcquireManager()
HRESULT PopMenuPopup(CMenuBand *mb)
static void ReleaseManager(CMenuFocusManager *obj)
HRESULT PushTrackedPopup(HMENU popup)
HRESULT PushMenuPopup(CMenuBand *mb)
HRESULT PopTrackedPopup(HMENU popup)
HRESULT PopMenuBar(CMenuBand *mb)
HRESULT PushMenuBar(CMenuBand *mb)
HRESULT SetShellFolder(IShellFolder *psf, LPCITEMIDLIST pidlFolder, HKEY hKey, DWORD dwFlags)
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) override
HRESULT GetShellFolder(DWORD *pdwFlags, LPITEMIDLIST *ppidl, REFIID riid, void **ppv)
HRESULT GetMenu(HMENU *phmenu, HWND *phwnd, DWORD *pdwFlags)
HRESULT SetMenu(HMENU hmenu, HWND hwnd, DWORD dwFlags)
virtual HRESULT FillToolbar(BOOL clearFirst=FALSE) override
HRESULT GetSizes(SIZE *pMinSize, SIZE *pMaxSize, SIZE *pIntegralSize)
HRESULT PopupItem(INT iItem, BOOL keyInitiated)
HRESULT KillPopupTimer()
HRESULT OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *theResult)
HRESULT IsWindowOwner(HWND hwnd)
HRESULT ChangePopupItem(CMenuToolbarBase *toolbar, INT item)
HRESULT DisableMouseTrack(BOOL bDisable)
HRESULT MenuBarMouseUp(INT iIndex, BOOL isLButton)
HRESULT ShowDW(BOOL fShow)
HRESULT CreateToolbar(HWND hwndParent, DWORD dwFlags)
HRESULT MenuBarMouseDown(INT iIndex, BOOL isLButton)
HRESULT SetPosSize(int x, int y, int cx, int cy)
HRESULT ChangeHotItem(CMenuToolbarBase *toolbar, INT item, DWORD dwFlags)
HRESULT GetWindow(HWND *phwnd)
HRESULT BeforeCancelPopup()
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static HWND hwndParent
Definition: cryptui.c:300
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:68
HRESULT WINAPI IUnknown_QueryServiceExec(IUnknown *lpUnknown, REFIID service, const GUID *group, DWORD cmdId, DWORD cmdOpt, VARIANT *pIn, VARIANT *pOut)
Definition: ordinal.c:1553
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1501
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1411
r parent
Definition: btrfs.c:3010
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLenum const GLfloat * params
Definition: glext.h:5645
GLbitfield flags
Definition: glext.h:7161
GLuint id
Definition: glext.h:5910
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT InvokeCommand([in] LPCMINVOKECOMMANDINFO lpici)
HRESULT QueryContextMenu([in] HMENU hmenu, [in] UINT indexMenu, [in] UINT idCmdFirst, [in] UINT idCmdLast, [in] UINT uFlags)
int MP_POPUPFLAGS
Definition: shobjidl.idl:2611
@ MPOS_CANCELLEVEL
Definition: shobjidl.idl:2588
@ MPOS_SELECTRIGHT
Definition: shobjidl.idl:2590
@ MPOS_CHILDTRACKING
Definition: shobjidl.idl:2591
@ MPPF_INITIALSELECT
Definition: shobjidl.idl:2597
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
nsrefcnt Release()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static const WCHAR tb[]
Definition: suminfo.c:285
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
static HWND child
Definition: cursoricon.c:298
static ATOM item
Definition: dde.c:856
static HMENU hmenu
Definition: win.c:66
#define min(a, b)
Definition: monoChain.cc:55
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
unsigned int UINT
Definition: ndis.h:50
_Out_ LPRECT prc
Definition: ntgdi.h:1658
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
#define CMenuSite_CreateInstance
Definition: shellmenu.h:87
#define CMenuDeskBar_CreateInstance
Definition: shellmenu.h:75
HRESULT hr
Definition: shlfolder.c:183
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define TRACE(s)
Definition: solgame.cpp:4
Definition: scsiwmi.h:51
LONG y
Definition: windef.h:330
LONG x
Definition: windef.h:329
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
PIDLIST_ABSOLUTE pidlFolder
Definition: shobjidl.idl:2748
IUnknown * punk
Definition: shobjidl.idl:2747
PUITEMID_CHILD pidlItem
Definition: shobjidl.idl:2749
UINT uIdAncestor
Definition: shobjidl.idl:2746
HMENU hmenu
Definition: shobjidl.idl:2742
IShellFolder * psf
Definition: shobjidl.idl:2750
UINT uIdParent
Definition: shobjidl.idl:2745
#define max(a, b)
Definition: svc.c:63
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ void _In_ PCCERT_CONTEXT _In_opt_ LPFILETIME _In_ DWORD _In_ DWORD _Outptr_opt_ void ** ppvObject
Definition: wincrypt.h:6082
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define E_POINTER
Definition: winerror.h:2365
BOOL WINAPI IsWindow(_In_opt_ HWND)
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define WM_CANCELMODE
Definition: winuser.h:1646
#define WM_WININICHANGE
Definition: winuser.h:1641
#define VK_CONTROL
Definition: winuser.h:2214
#define VK_UP
Definition: winuser.h:2236
BOOL WINAPI TrackPopupMenuEx(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _In_ HWND, _In_opt_ LPTPMPARAMS)
#define WM_ACTIVATE
Definition: winuser.h:1623
#define VK_END
Definition: winuser.h:2233
#define TPM_LEFTALIGN
Definition: winuser.h:2388
#define VK_HOME
Definition: winuser.h:2234
struct tagTPMPARAMS TPMPARAMS
#define SendMessage
Definition: winuser.h:5863
#define TPM_VERTICAL
Definition: winuser.h:2393
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define VK_LEFT
Definition: winuser.h:2235
#define VK_RIGHT
Definition: winuser.h:2237
#define VK_DOWN
Definition: winuser.h:2238
#define VK_SHIFT
Definition: winuser.h:2213
#define SW_SHOW
Definition: winuser.h:786
#define TPM_RETURNCMD
Definition: winuser.h:2398
#define SystemParametersInfo
Definition: winuser.h:5878
SHORT WINAPI GetKeyState(_In_ int)
#define IID_PPV_ARG(Itype, ppType)