ReactOS 0.4.15-dev-6679-g945ee4b
syspager.cpp
Go to the documentation of this file.
1/*
2 * ReactOS Explorer
3 *
4 * Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
5 * Copyright 2018 Ged Murphy <gedmurphy@reactos.org>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22#include "precomp.h"
23
25{
26 // Must keep a separate copy since the original is unioned with uTimeout.
28};
29
31{
35
38 {
40 IconData.hWnd = iconData->hWnd;
41 IconData.uID = iconData->uID;
42 IconData.guidItem = iconData->guidItem;
43 }
44
46 {
47 if (hProcess)
48 {
50 }
51 }
52};
53
55{
61 bool m_Loop;
62
63public:
65
66 virtual ~CIconWatcher();
67
69 void Uninitialize();
70
73
75
76private:
77
78 static UINT WINAPI WatcherThread(_In_opt_ LPVOID lpParam);
79};
80
81class CNotifyToolbar;
82
84{
85public:
86 static const int TimerInterval = 2000;
87 static const int BalloonsTimerId = 1;
88 static const int MinTimeout = 10000;
89 static const int MaxTimeout = 30000;
90 static const int CooldownBetweenBalloons = 2000;
91
92private:
93 struct Info
94 {
100
102 {
103 pSource = source;
106 uIcon = source->dwInfoFlags & NIIF_ICON_MASK;
107 if (source->dwInfoFlags == NIIF_USER)
108 uIcon = reinterpret_cast<WPARAM>(source->hIcon);
109 uTimeout = source->uTimeout;
110 }
111 };
112
114
116
118
120
123
125
126public:
128
129 void Init(HWND hwndParent, CNotifyToolbar * toolbar, CTooltips * balloons);
130 void Deinit();
131
132 bool OnTimer(int timerId);
133 void UpdateInfo(InternalIconData * notifyItem);
134 void RemoveInfo(InternalIconData * notifyItem);
135 void CloseCurrent();
136
137private:
138
140 void SetTimer(int length);
141 void Show(Info& info);
142 void Close(IN OUT InternalIconData * notifyItem, IN UINT uReason);
143};
144
146 public CWindowImplBaseT< CToolbar<InternalIconData>, CControlWinTraits >
147{
150
152
153public:
155 virtual ~CNotifyToolbar();
156
165 bool SendNotifyCallback(InternalIconData* notifyItem, UINT uMsg);
166
167private:
168 LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
171 LRESULT OnTooltipShow(INT uCode, LPNMHDR hdr, BOOL& bHandled);
172
173public:
179
181};
182
183
184static const WCHAR szSysPagerWndClass[] = L"SysPager";
185
190 public IOleWindow,
191 public CIconWatcher
192{
196
197public:
198 CSysPagerWnd();
199 virtual ~CSysPagerWnd();
200
202 LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
203 LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
204 LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
205 LRESULT OnGetInfoTip(INT uCode, LPNMHDR hdr, BOOL& bHandled);
206 LRESULT OnCustomDraw(INT uCode, LPNMHDR hdr, BOOL& bHandled);
207 LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
208 LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
209 LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
210 LRESULT OnBalloonPop(UINT uCode, LPNMHDR hdr, BOOL& bHandled);
211 LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
212 LRESULT OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
213 LRESULT OnSettingChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
214 LRESULT OnGetMinimumSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
215
216public:
217
219 {
220 if (!phwnd)
221 return E_INVALIDARG;
222 *phwnd = m_hWnd;
223 return S_OK;
224 }
225
227 {
228 return E_NOTIMPL;
229 }
230
232
237
238 BOOL NotifyIcon(DWORD dwMessage, _In_ CONST NOTIFYICONDATA *iconData);
239 void GetSize(IN BOOL IsHorizontal, IN PSIZE size);
240
242
246 MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
251 MESSAGE_HANDLER(WM_COPYDATA, OnCopyData)
252 MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChanged)
253 MESSAGE_HANDLER(TNWM_GETMINIMUMSIZE, OnGetMinimumSize)
254 NOTIFY_CODE_HANDLER(TTN_POP, OnBalloonPop)
258
260};
261
262/*
263 * IconWatcher
264 */
265
267 m_hWatcherThread(NULL),
268 m_WakeUpEvent(NULL),
269 m_hwndSysTray(NULL),
270 m_Loop(false)
271{
272}
273
275{
276 Uninitialize();
277 DeleteCriticalSection(&m_ListLock);
278
279 if (m_WakeUpEvent)
280 CloseHandle(m_WakeUpEvent);
281 if (m_hWatcherThread)
282 CloseHandle(m_hWatcherThread);
283}
284
286{
287 m_hwndSysTray = hWndParent;
288
289 InitializeCriticalSection(&m_ListLock);
290 m_WakeUpEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
291 if (m_WakeUpEvent == NULL)
292 return false;
293
294 m_hWatcherThread = (HANDLE)_beginthreadex(NULL,
295 0,
296 WatcherThread,
297 (LPVOID)this,
298 0,
299 NULL);
300 if (m_hWatcherThread == NULL)
301 return false;
302
303 return true;
304}
305
307{
308 m_Loop = false;
309 if (m_WakeUpEvent)
310 SetEvent(m_WakeUpEvent);
311
312 EnterCriticalSection(&m_ListLock);
313
315 for (size_t i = 0; i < m_WatcherList.GetCount(); i++)
316 {
317 Pos = m_WatcherList.FindIndex(i);
318 if (Pos)
319 {
321 Icon = m_WatcherList.GetAt(Pos);
322 delete Icon;
323 }
324 }
325 m_WatcherList.RemoveAll();
326
327 LeaveCriticalSection(&m_ListLock);
328}
329
331{
333 (void)GetWindowThreadProcessId(iconData->hWnd, &ProcessId);
334
337 if (hProcess == NULL)
338 {
339 return false;
340 }
341
342 IconWatcherData *Icon = new IconWatcherData(iconData);
343 Icon->hProcess = hProcess;
344 Icon->ProcessId = ProcessId;
345
346 bool Added = false;
347 EnterCriticalSection(&m_ListLock);
348
349 // The likelyhood of someone having more than 64 icons in their tray is
350 // pretty slim. We could spin up a new thread for each multiple of 64, but
351 // it's not worth the effort, so we just won't bother watching those icons
352 if (m_WatcherList.GetCount() < MAXIMUM_WAIT_OBJECTS)
353 {
354 m_WatcherList.AddTail(Icon);
355 SetEvent(m_WakeUpEvent);
356 Added = true;
357 }
358
359 LeaveCriticalSection(&m_ListLock);
360
361 if (!Added)
362 {
363 delete Icon;
364 }
365
366 return Added;
367}
368
370{
371 EnterCriticalSection(&m_ListLock);
372
374 Icon = GetListEntry(iconData, NULL, true);
375
376 SetEvent(m_WakeUpEvent);
377 LeaveCriticalSection(&m_ListLock);
378
379 delete Icon;
380 return true;
381}
382
384{
386 POSITION NextPosition = m_WatcherList.GetHeadPosition();
388 do
389 {
390 Position = NextPosition;
391
392 Entry = m_WatcherList.GetNext(NextPosition);
393 if (Entry)
394 {
395 if ((iconData && ((Entry->IconData.hWnd == iconData->hWnd) && (Entry->IconData.uID == iconData->uID))) ||
396 (hProcess && (Entry->hProcess == hProcess)))
397 {
398 if (Remove)
399 m_WatcherList.RemoveAt(Position);
400 break;
401 }
402 }
403 Entry = NULL;
404
405 } while (NextPosition != NULL);
406
407 return Entry;
408}
409
411{
412 CIconWatcher* This = reinterpret_cast<CIconWatcher *>(lpParam);
413 HANDLE *WatchList = NULL;
414
415 This->m_Loop = true;
416 while (This->m_Loop)
417 {
418 EnterCriticalSection(&This->m_ListLock);
419
420 DWORD Size;
421 Size = This->m_WatcherList.GetCount() + 1;
423
424 if (WatchList)
425 delete[] WatchList;
426 WatchList = new HANDLE[Size];
427 WatchList[0] = This->m_WakeUpEvent;
428
430 for (size_t i = 0; i < This->m_WatcherList.GetCount(); i++)
431 {
432 Pos = This->m_WatcherList.FindIndex(i);
433 if (Pos)
434 {
436 Icon = This->m_WatcherList.GetAt(Pos);
437 WatchList[i + 1] = Icon->hProcess;
438 }
439 }
440
441 LeaveCriticalSection(&This->m_ListLock);
442
445 WatchList,
446 FALSE,
447 INFINITE);
448 if (Status == WAIT_OBJECT_0)
449 {
450 // We've been kicked, we have updates to our list (or we're exiting the thread)
451 if (This->m_Loop)
452 TRACE("Updating watched icon list\n");
453 }
454 else if ((Status >= WAIT_OBJECT_0 + 1) && (Status < Size))
455 {
457 Icon = This->GetListEntry(NULL, WatchList[Status], false);
458
459 TRACE("Pid %lu owns a notification icon and has stopped without deleting it. We'll cleanup on its behalf\n", Icon->ProcessId);
460
461 TRAYNOTIFYDATAW tnid = {0};
462 tnid.dwSignature = NI_NOTIFY_SIG;
463 tnid.dwMessage = NIM_DELETE;
464 CopyMemory(&tnid.nid, &Icon->IconData, Icon->IconData.cbSize);
465
467 data.dwData = 1;
468 data.cbData = sizeof(tnid);
469 data.lpData = &tnid;
470
471 BOOL Success = ::SendMessage(This->m_hwndSysTray, WM_COPYDATA,
472 (WPARAM)&Icon->IconData, (LPARAM)&data);
473 if (!Success)
474 {
475 // If we failed to handle the delete message, forcibly remove it
476 This->RemoveIconFromWatcher(&Icon->IconData);
477 }
478 }
479 else
480 {
481 if (Status == WAIT_FAILED)
482 {
484 }
485 ERR("Failed to wait on process handles : %lu\n", Status);
486 This->Uninitialize();
487 }
488 }
489
490 if (WatchList)
491 delete[] WatchList;
492
493 return 0;
494}
495
496/*
497 * BalloonQueue
498 */
499
501 m_hwndParent(NULL),
502 m_tooltips(NULL),
503 m_toolbar(NULL),
504 m_current(NULL),
505 m_currentClosed(false),
506 m_timer(-1)
507{
508}
509
511{
513 m_toolbar = toolbar;
514 m_tooltips = balloons;
515}
516
518{
519 if (m_timer >= 0)
520 {
522 }
523}
524
525bool CBalloonQueue::OnTimer(int timerId)
526{
527 if (timerId != m_timer)
528 return false;
529
531 m_timer = -1;
532
534 {
535 Close(m_current, NIN_BALLOONTIMEOUT);
536 }
537 else
538 {
539 m_current = NULL;
540 m_currentClosed = false;
541 if (!m_queue.IsEmpty())
542 {
543 Info info = m_queue.RemoveHead();
544 Show(info);
545 }
546 }
547
548 return true;
549}
550
552{
553 size_t len = 0;
554 HRESULT hr = StringCchLength(notifyItem->szInfo, _countof(notifyItem->szInfo), &len);
555 if (SUCCEEDED(hr) && len > 0)
556 {
557 Info info(notifyItem);
558
559 // If m_current == notifyItem, we want to replace the previous balloon even if there is a queue.
560 if (m_current != notifyItem && (m_current != NULL || !m_queue.IsEmpty()))
561 {
562 m_queue.AddTail(info);
563 }
564 else
565 {
566 Show(info);
567 }
568 }
569 else
570 {
571 Close(notifyItem, NIN_BALLOONHIDE);
572 }
573}
574
576{
577 Close(notifyItem, NIN_BALLOONHIDE);
578
579 POSITION position = m_queue.GetHeadPosition();
580 while(position != NULL)
581 {
582 Info& info = m_queue.GetNext(position);
583 if (info.pSource == notifyItem)
584 {
585 m_queue.RemoveAt(position);
586 }
587 }
588}
589
591{
592 if (m_current != NULL)
593 {
594 Close(m_current, NIN_BALLOONTIMEOUT);
595 }
596}
597
599{
600 int count = m_toolbar->GetButtonCount();
601 for (int i = 0; i < count; i++)
602 {
603 if (m_toolbar->GetItemData(i) == pdata)
604 return i;
605 }
606 return -1;
607}
608
610{
612}
613
615{
616 TRACE("ShowBalloonTip called for flags=%x text=%ws; title=%ws\n", info.uIcon, info.szInfo, info.szInfoTitle);
617
618 // TODO: NIF_REALTIME, NIIF_NOSOUND, other Vista+ flags
619
620 const int index = IndexOf(info.pSource);
621 RECT rc;
622 m_toolbar->GetItemRect(index, &rc);
624 const WORD x = (rc.left + rc.right) / 2;
625 const WORD y = (rc.top + rc.bottom) / 2;
626
627 m_tooltips->SetTitle(info.szInfoTitle, info.uIcon);
629 m_tooltips->UpdateTipText(m_hwndParent, reinterpret_cast<LPARAM>(m_toolbar->m_hWnd), info.szInfo);
631
632 m_current = info.pSource;
633 int timeout = info.uTimeout;
636
638
639 m_toolbar->SendNotifyCallback(m_current, NIN_BALLOONSHOW);
640}
641
643{
644 TRACE("HideBalloonTip called\n");
645
646 if (m_current == notifyItem && !m_currentClosed)
647 {
649
650 // Prevent Re-entry
651 m_currentClosed = true;
654 }
655}
656
657/*
658 * NotifyToolbar
659 */
660
662 m_ImageList(NULL),
663 m_VisibleButtonCount(0),
664 m_BalloonQueue(NULL)
665{
666}
667
669{
670}
671
673{
675}
676
678{
679 int count = GetButtonCount();
680
681 for (int i = 0; i < count; i++)
682 {
683 InternalIconData * data = GetItemData(i);
684
685 if (data->hWnd == hWnd &&
686 data->uID == uID)
687 {
688 if (pdata)
689 *pdata = data;
690 return i;
691 }
692 }
693
694 return -1;
695}
696
698{
699 int count = GetButtonCount();
700 for (int i = 0; i < count; i++)
701 {
702 InternalIconData * data = GetItemData(i);
703 if (data->hIcon == handle)
704 {
705 TBBUTTON btn;
706 GetButton(i, &btn);
707 return btn.iBitmap;
708 }
709 }
710
711 return -1;
712}
713
715{
716 TBBUTTON tbBtn = { 0 };
717 InternalIconData * notifyItem;
718 WCHAR text[] = L"";
719
720 TRACE("Adding icon %d from hWnd %08x flags%s%s state%s%s\n",
721 iconData->uID, iconData->hWnd,
722 (iconData->uFlags & NIF_ICON) ? " ICON" : "",
723 (iconData->uFlags & NIF_STATE) ? " STATE" : "",
724 (iconData->dwState & NIS_HIDDEN) ? " HIDDEN" : "",
725 (iconData->dwState & NIS_SHAREDICON) ? " SHARED" : "");
726
727 int index = FindItem(iconData->hWnd, iconData->uID, &notifyItem);
728 if (index >= 0)
729 {
730 TRACE("Icon %d from hWnd %08x ALREADY EXISTS!\n", iconData->uID, iconData->hWnd);
731 return FALSE;
732 }
733
734 notifyItem = new InternalIconData();
735 ZeroMemory(notifyItem, sizeof(*notifyItem));
736
737 notifyItem->hWnd = iconData->hWnd;
738 notifyItem->uID = iconData->uID;
739
740 tbBtn.fsState = TBSTATE_ENABLED;
741 tbBtn.fsStyle = BTNS_NOPREFIX;
742 tbBtn.dwData = (DWORD_PTR)notifyItem;
743 tbBtn.iString = (INT_PTR) text;
744 tbBtn.idCommand = GetButtonCount();
745 tbBtn.iBitmap = -1;
746
747 if (iconData->uFlags & NIF_STATE)
748 {
749 notifyItem->dwState = iconData->dwState & iconData->dwStateMask;
750 }
751
752 if (iconData->uFlags & NIF_MESSAGE)
753 {
754 notifyItem->uCallbackMessage = iconData->uCallbackMessage;
755 }
756
757 if (iconData->uFlags & NIF_ICON)
758 {
759 notifyItem->hIcon = iconData->hIcon;
760 BOOL hasSharedIcon = notifyItem->dwState & NIS_SHAREDICON;
761 if (hasSharedIcon)
762 {
763 INT iIcon = FindExistingSharedIcon(notifyItem->hIcon);
764 if (iIcon < 0)
765 {
766 notifyItem->hIcon = NULL;
767 TRACE("Shared icon requested, but HICON not found!!!\n");
768 }
769 tbBtn.iBitmap = iIcon;
770 }
771 else
772 {
773 tbBtn.iBitmap = ImageList_AddIcon(m_ImageList, notifyItem->hIcon);
774 }
775 }
776
777 if (iconData->uFlags & NIF_TIP)
778 {
779 StringCchCopy(notifyItem->szTip, _countof(notifyItem->szTip), iconData->szTip);
780 }
781
782 if (iconData->uFlags & NIF_INFO)
783 {
784 // NOTE: In Vista+, the uTimeout value is disregarded, and the accessibility settings are used always.
785 StringCchCopy(notifyItem->szInfo, _countof(notifyItem->szInfo), iconData->szInfo);
786 StringCchCopy(notifyItem->szInfoTitle, _countof(notifyItem->szInfoTitle), iconData->szInfoTitle);
787 notifyItem->dwInfoFlags = iconData->dwInfoFlags;
788 notifyItem->uTimeout = iconData->uTimeout;
789 }
790
791 if (notifyItem->dwState & NIS_HIDDEN)
792 {
793 tbBtn.fsState |= TBSTATE_HIDDEN;
794 }
795 else
796 {
798 }
799
800 /* TODO: support VERSION_4 (NIF_GUID, NIF_REALTIME, NIF_SHOWTIP) */
801
802 CToolbar::AddButton(&tbBtn);
804
805 if (iconData->uFlags & NIF_INFO)
806 {
807 m_BalloonQueue->UpdateInfo(notifyItem);
808 }
809
810 return TRUE;
811}
812
814{
815 InternalIconData * notifyItem;
816 int index = FindItem(iconData->hWnd, iconData->uID, &notifyItem);
817 if (index < 0)
818 {
819 WARN("Icon %d from hWnd %08x DOES NOT EXIST!\n", iconData->uID, iconData->hWnd);
820 return FALSE;
821 }
822
823 if (iconData->uVersion != 0 && iconData->uVersion != NOTIFYICON_VERSION)
824 {
825 WARN("Tried to set the version of icon %d from hWnd %08x, to an unknown value %d. Vista+ program?\n", iconData->uID, iconData->hWnd, iconData->uVersion);
826 return FALSE;
827 }
828
829 // We can not store the version in the uVersion field, because it's union'd with uTimeout,
830 // which we also need to keep track of.
831 notifyItem->uVersionCopy = iconData->uVersion;
832
833 return TRUE;
834}
835
837{
838 InternalIconData * notifyItem;
839 TBBUTTONINFO tbbi = { 0 };
840
841 TRACE("Updating icon %d from hWnd %08x flags%s%s state%s%s\n",
842 iconData->uID, iconData->hWnd,
843 (iconData->uFlags & NIF_ICON) ? " ICON" : "",
844 (iconData->uFlags & NIF_STATE) ? " STATE" : "",
845 (iconData->dwState & NIS_HIDDEN) ? " HIDDEN" : "",
846 (iconData->dwState & NIS_SHAREDICON) ? " SHARED" : "");
847
848 int index = FindItem(iconData->hWnd, iconData->uID, &notifyItem);
849 if (index < 0)
850 {
851 WARN("Icon %d from hWnd %08x DOES NOT EXIST!\n", iconData->uID, iconData->hWnd);
852 return AddButton(iconData);
853 }
854
855 TBBUTTON btn;
856 GetButton(index, &btn);
857 int oldIconIndex = btn.iBitmap;
858
859 tbbi.cbSize = sizeof(tbbi);
860 tbbi.dwMask = TBIF_BYINDEX | TBIF_COMMAND;
861 tbbi.idCommand = index;
862
863 if (iconData->uFlags & NIF_STATE)
864 {
865 if (iconData->dwStateMask & NIS_HIDDEN &&
866 (notifyItem->dwState & NIS_HIDDEN) != (iconData->dwState & NIS_HIDDEN))
867 {
868 tbbi.dwMask |= TBIF_STATE;
869 if (iconData->dwState & NIS_HIDDEN)
870 {
871 tbbi.fsState |= TBSTATE_HIDDEN;
873 }
874 else
875 {
876 tbbi.fsState &= ~TBSTATE_HIDDEN;
878 }
879 }
880
881 notifyItem->dwState &= ~iconData->dwStateMask;
882 notifyItem->dwState |= (iconData->dwState & iconData->dwStateMask);
883 }
884
885 if (iconData->uFlags & NIF_MESSAGE)
886 {
887 notifyItem->uCallbackMessage = iconData->uCallbackMessage;
888 }
889
890 if (iconData->uFlags & NIF_ICON)
891 {
892 BOOL hasSharedIcon = notifyItem->dwState & NIS_SHAREDICON;
893 if (hasSharedIcon)
894 {
895 INT iIcon = FindExistingSharedIcon(iconData->hIcon);
896 if (iIcon >= 0)
897 {
898 notifyItem->hIcon = iconData->hIcon;
899 tbbi.dwMask |= TBIF_IMAGE;
900 tbbi.iImage = iIcon;
901 }
902 else
903 {
904 TRACE("Shared icon requested, but HICON not found!!! IGNORING!\n");
905 }
906 }
907 else
908 {
909 notifyItem->hIcon = iconData->hIcon;
910 tbbi.dwMask |= TBIF_IMAGE;
911 tbbi.iImage = ImageList_ReplaceIcon(m_ImageList, oldIconIndex, notifyItem->hIcon);
912 }
913 }
914
915 if (iconData->uFlags & NIF_TIP)
916 {
917 StringCchCopy(notifyItem->szTip, _countof(notifyItem->szTip), iconData->szTip);
918 }
919
920 if (iconData->uFlags & NIF_INFO)
921 {
922 // NOTE: In Vista+, the uTimeout value is disregarded, and the accessibility settings are used always.
923 StringCchCopy(notifyItem->szInfo, _countof(notifyItem->szInfo), iconData->szInfo);
924 StringCchCopy(notifyItem->szInfoTitle, _countof(notifyItem->szInfoTitle), iconData->szInfoTitle);
925 notifyItem->dwInfoFlags = iconData->dwInfoFlags;
926 notifyItem->uTimeout = iconData->uTimeout;
927 }
928
929 /* TODO: support VERSION_4 (NIF_GUID, NIF_REALTIME, NIF_SHOWTIP) */
930
931 SetButtonInfo(index, &tbbi);
932
933 if (iconData->uFlags & NIF_INFO)
934 {
935 m_BalloonQueue->UpdateInfo(notifyItem);
936 }
937
938 return TRUE;
939}
940
942{
943 InternalIconData * notifyItem;
944
945 TRACE("Removing icon %d from hWnd %08x\n", iconData->uID, iconData->hWnd);
946
947 int index = FindItem(iconData->hWnd, iconData->uID, &notifyItem);
948 if (index < 0)
949 {
950 TRACE("Icon %d from hWnd %08x ALREADY MISSING!\n", iconData->uID, iconData->hWnd);
951
952 return FALSE;
953 }
954
955 if (!(notifyItem->dwState & NIS_HIDDEN))
956 {
958 }
959
960 if (!(notifyItem->dwState & NIS_SHAREDICON))
961 {
962 TBBUTTON btn;
963 GetButton(index, &btn);
964 int oldIconIndex = btn.iBitmap;
965 ImageList_Remove(m_ImageList, oldIconIndex);
966
967 // Update other icons!
968 int count = GetButtonCount();
969 for (int i = 0; i < count; i++)
970 {
971 TBBUTTON btn;
972 GetButton(i, &btn);
973
974 if (btn.iBitmap > oldIconIndex)
975 {
976 TBBUTTONINFO tbbi2 = { 0 };
977 tbbi2.cbSize = sizeof(tbbi2);
978 tbbi2.dwMask = TBIF_BYINDEX | TBIF_IMAGE;
979 tbbi2.iImage = btn.iBitmap-1;
980 SetButtonInfo(i, &tbbi2);
981 }
982 }
983 }
984
985 m_BalloonQueue->RemoveInfo(notifyItem);
986
987 DeleteButton(index);
988
989 delete notifyItem;
990
991 return TRUE;
992}
993
995{
996 int cx, cy;
997 HIMAGELIST iml;
998
1000 return;
1001
1003 return;
1004
1006 if (!iml)
1007 return;
1008
1010 m_ImageList = iml;
1012
1013 int count = GetButtonCount();
1014 for (int i = 0; i < count; i++)
1015 {
1016 InternalIconData * data = GetItemData(i);
1017 BOOL hasSharedIcon = data->dwState & NIS_SHAREDICON;
1018 INT iIcon = hasSharedIcon ? FindExistingSharedIcon(data->hIcon) : -1;
1019 if (iIcon < 0)
1020 iIcon = ImageList_AddIcon(iml, data->hIcon);
1021 TBBUTTONINFO tbbi = { sizeof(tbbi), TBIF_BYINDEX | TBIF_IMAGE, 0, iIcon};
1022 SetButtonInfo(i, &tbbi);
1023 }
1024
1026}
1027
1029{
1030 bHandled = FALSE;
1031
1032 /*
1033 * WM_CONTEXTMENU message can be generated either by the mouse,
1034 * in which case lParam encodes the mouse coordinates where the
1035 * user right-clicked the mouse, or can be generated by (Shift-)F10
1036 * keyboard press, in which case lParam equals -1.
1037 */
1038 INT iBtn = GetHotItem();
1039 if (iBtn < 0)
1040 return 0;
1041
1042 InternalIconData* notifyItem = GetItemData(iBtn);
1043
1044 if (!::IsWindow(notifyItem->hWnd))
1045 return 0;
1046
1047 if (notifyItem->uVersionCopy >= NOTIFYICON_VERSION)
1048 {
1049 /* Transmit the WM_CONTEXTMENU message if the notification icon supports it */
1050 ::SendNotifyMessage(notifyItem->hWnd,
1051 notifyItem->uCallbackMessage,
1052 notifyItem->uID,
1054 }
1055 else if (lParam == -1)
1056 {
1057 /*
1058 * Otherwise, and only if the WM_CONTEXTMENU message was generated
1059 * from the keyboard, simulate right-click mouse messages. This is
1060 * not needed if the message came from the mouse because in this
1061 * case the right-click mouse messages were already sent together.
1062 */
1063 ::SendNotifyMessage(notifyItem->hWnd,
1064 notifyItem->uCallbackMessage,
1065 notifyItem->uID,
1067 ::SendNotifyMessage(notifyItem->hWnd,
1068 notifyItem->uCallbackMessage,
1069 notifyItem->uID,
1070 WM_RBUTTONUP);
1071 }
1072
1073 return 0;
1074}
1075
1077{
1078 if (!::IsWindow(notifyItem->hWnd))
1079 {
1080 // We detect and destroy icons with invalid handles only on mouse move over systray, same as MS does.
1081 // Alternatively we could search for them periodically (would waste more resources).
1082 TRACE("Destroying icon %d with invalid handle hWnd=%08x\n", notifyItem->uID, notifyItem->hWnd);
1083
1084 RemoveButton(notifyItem);
1085
1086 /* Ask the parent to resize */
1087 NMHDR nmh = {GetParent(), 0, NTNWM_REALIGN};
1088 GetParent().SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh);
1089
1090 return true;
1091 }
1092
1093 DWORD pid;
1094 GetWindowThreadProcessId(notifyItem->hWnd, &pid);
1095
1096 if (pid == GetCurrentProcessId() ||
1097 (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST))
1098 {
1099 ::PostMessage(notifyItem->hWnd,
1100 notifyItem->uCallbackMessage,
1101 notifyItem->uID,
1102 uMsg);
1103 }
1104 else
1105 {
1106 ::SendMessage(notifyItem->hWnd,
1107 notifyItem->uCallbackMessage,
1108 notifyItem->uID,
1109 uMsg);
1110 }
1111 return false;
1112}
1113
1115{
1116 static LPCWSTR eventNames [] = {
1117 L"WM_MOUSEMOVE",
1118 L"WM_LBUTTONDOWN",
1119 L"WM_LBUTTONUP",
1120 L"WM_LBUTTONDBLCLK",
1121 L"WM_RBUTTONDOWN",
1122 L"WM_RBUTTONUP",
1123 L"WM_RBUTTONDBLCLK",
1124 L"WM_MBUTTONDOWN",
1125 L"WM_MBUTTONUP",
1126 L"WM_MBUTTONDBLCLK",
1127 L"WM_MOUSEWHEEL",
1128 L"WM_XBUTTONDOWN",
1129 L"WM_XBUTTONUP",
1130 L"WM_XBUTTONDBLCLK"
1131 };
1132
1133 InternalIconData * notifyItem = GetItemData(wIndex);
1134
1135 if (uMsg >= WM_MOUSEFIRST && uMsg <= WM_MOUSELAST)
1136 {
1137 TRACE("Sending message %S from button %d to %p (msg=%x, w=%x, l=%x)...\n",
1138 eventNames[uMsg - WM_MOUSEFIRST], wIndex,
1139 notifyItem->hWnd, notifyItem->uCallbackMessage, notifyItem->uID, uMsg);
1140 }
1141
1142 SendNotifyCallback(notifyItem, uMsg);
1143}
1144
1146{
1148 INT iBtn = HitTest(&pt);
1149
1150 if (iBtn >= 0)
1151 {
1152 SendMouseEvent(iBtn, uMsg, wParam);
1153 }
1154
1155 bHandled = FALSE;
1156 return FALSE;
1157}
1158
1160{
1161 InternalIconData * notifyItem = reinterpret_cast<InternalIconData *>(data);
1162 if (notifyItem)
1163 {
1164 StringCchCopy(szTip, cchTip, notifyItem->szTip);
1165 }
1166 else
1167 {
1168 StringCchCopy(szTip, cchTip, L"");
1169 }
1170}
1171
1173{
1174 RECT rcTip, rcItem;
1175 ::GetWindowRect(hdr->hwndFrom, &rcTip);
1176
1177 SIZE szTip = { rcTip.right - rcTip.left, rcTip.bottom - rcTip.top };
1178
1179 INT iBtn = GetHotItem();
1180
1181 if (iBtn >= 0)
1182 {
1183 MONITORINFO monInfo = { 0 };
1184 HMONITOR hMon = MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONEAREST);
1185
1186 monInfo.cbSize = sizeof(monInfo);
1187
1188 if (hMon)
1189 GetMonitorInfo(hMon, &monInfo);
1190 else
1191 ::GetWindowRect(GetDesktopWindow(), &monInfo.rcMonitor);
1192
1193 GetItemRect(iBtn, &rcItem);
1194
1195 POINT ptItem = { rcItem.left, rcItem.top };
1196 SIZE szItem = { rcItem.right - rcItem.left, rcItem.bottom - rcItem.top };
1197 ClientToScreen(&ptItem);
1198
1199 ptItem.x += szItem.cx / 2;
1200 ptItem.y -= szTip.cy;
1201
1202 if (ptItem.x + szTip.cx > monInfo.rcMonitor.right)
1203 ptItem.x = monInfo.rcMonitor.right - szTip.cx;
1204
1205 if (ptItem.y + szTip.cy > monInfo.rcMonitor.bottom)
1206 ptItem.y = monInfo.rcMonitor.bottom - szTip.cy;
1207
1208 if (ptItem.x < monInfo.rcMonitor.left)
1209 ptItem.x = monInfo.rcMonitor.left;
1210
1211 if (ptItem.y < monInfo.rcMonitor.top)
1212 ptItem.y = monInfo.rcMonitor.top;
1213
1214 TRACE("ptItem { %d, %d }\n", ptItem.x, ptItem.y);
1215
1216 ::SetWindowPos(hdr->hwndFrom, NULL, ptItem.x, ptItem.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
1217
1218 return TRUE;
1219 }
1220
1221 bHandled = FALSE;
1222 return 0;
1223}
1224
1226{
1228
1229 DWORD styles =
1233
1234 // HACK & FIXME: CORE-18016
1236 m_hWnd = NULL;
1238
1239 // Force the toolbar tooltips window to always show tooltips even if not foreground
1240 HWND tooltipsWnd = (HWND)SendMessageW(TB_GETTOOLTIPS);
1241 if (tooltipsWnd)
1242 {
1243 ::SetWindowLong(tooltipsWnd, GWL_STYLE, ::GetWindowLong(tooltipsWnd, GWL_STYLE) | TTS_ALWAYSTIP);
1244 }
1245
1246 SetWindowTheme(m_hWnd, L"TrayNotify", NULL);
1247
1250
1251 TBMETRICS tbm = {sizeof(tbm)};
1253 tbm.cxPad = 1;
1254 tbm.cyPad = 1;
1256 {
1259 }
1260 tbm.cxBarPad = 1;
1261 tbm.cyBarPad = 1;
1262 tbm.cxButtonSpacing = 1;
1263 tbm.cyButtonSpacing = 1;
1264 SetMetrics(&tbm);
1265
1267}
1268
1269/*
1270 * SysPagerWnd
1271 */
1272
1274
1276
1278{
1279 HDC hdc = (HDC) wParam;
1280
1281 if (!IsAppThemed())
1282 {
1283 bHandled = FALSE;
1284 return 0;
1285 }
1286
1287 RECT rect;
1290
1291 return TRUE;
1292}
1293
1295{
1298
1299 HWND hWndTop = GetAncestor(m_hWnd, GA_ROOT);
1300
1302
1303 TOOLINFOW ti = { 0 };
1304 ti.cbSize = TTTOOLINFOW_V1_SIZE;
1305 ti.uFlags = TTF_TRACK | TTF_IDISHWND;
1306 ti.uId = reinterpret_cast<UINT_PTR>(Toolbar.m_hWnd);
1307 ti.hwnd = m_hWnd;
1308 ti.lpszText = NULL;
1309 ti.lParam = NULL;
1310
1311 BOOL ret = m_Balloons.AddTool(&ti);
1312 if (!ret)
1313 {
1314 WARN("AddTool failed, LastError=%d (probably meaningless unless non-zero)\n", GetLastError());
1315 }
1316
1318
1319 // Explicitly request running applications to re-register their systray icons
1321 RegisterWindowMessageW(L"TaskbarCreated"),
1322 0, 0);
1323
1324 return TRUE;
1325}
1326
1328{
1331 return TRUE;
1332}
1333
1335{
1336 BOOL ret = FALSE;
1337
1338 int VisibleButtonCount = Toolbar.GetVisibleButtonCount();
1339
1340 TRACE("NotifyIcon received. Code=%d\n", dwMessage);
1341 switch (dwMessage)
1342 {
1343 case NIM_ADD:
1344 ret = Toolbar.AddButton(iconData);
1345 if (ret == TRUE)
1346 {
1347 (void)AddIconToWatcher(iconData);
1348 }
1349 break;
1350
1351 case NIM_MODIFY:
1352 ret = Toolbar.UpdateButton(iconData);
1353 break;
1354
1355 case NIM_DELETE:
1356 ret = Toolbar.RemoveButton(iconData);
1357 if (ret == TRUE)
1358 {
1359 (void)RemoveIconFromWatcher(iconData);
1360 }
1361 break;
1362
1363 case NIM_SETFOCUS:
1364 Toolbar.SetFocus();
1365 ret = TRUE;
1366 break;
1367
1368 case NIM_SETVERSION:
1369 ret = Toolbar.SwitchVersion(iconData);
1370 break;
1371
1372 default:
1373 TRACE("NotifyIcon received with unknown code %d.\n", dwMessage);
1374 return FALSE;
1375 }
1376
1377 if (VisibleButtonCount != Toolbar.GetVisibleButtonCount())
1378 {
1379 /* Ask the parent to resize */
1380 NMHDR nmh = {GetParent(), 0, NTNWM_REALIGN};
1381 GetParent().SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh);
1382 }
1383
1384 return ret;
1385}
1386
1388{
1389 /* Get the ideal height or width */
1390#if 0
1391 /* Unfortunately this doens't work correctly in ros */
1392 Toolbar.GetIdealSize(!IsHorizontal, size);
1393
1394 /* Make the reference dimension an exact multiple of the icon size */
1395 if (IsHorizontal)
1396 size->cy -= size->cy % GetSystemMetrics(SM_CYSMICON);
1397 else
1398 size->cx -= size->cx % GetSystemMetrics(SM_CXSMICON);
1399
1400#else
1401 INT rows = 0;
1402 INT columns = 0;
1403 INT cyButton = GetSystemMetrics(SM_CYSMICON) + 2;
1404 INT cxButton = GetSystemMetrics(SM_CXSMICON) + 2;
1406 {
1407 cyButton = MulDiv(GetSystemMetrics(SM_CYSMICON), 3, 2);
1408 cxButton = MulDiv(GetSystemMetrics(SM_CXSMICON), 3, 2);
1409 }
1410 int VisibleButtonCount = Toolbar.GetVisibleButtonCount();
1411
1412 if (IsHorizontal)
1413 {
1415 rows = max(size->cy / MulDiv(cyButton, 3, 2), 1);
1416 else
1417 rows = max(size->cy / cyButton, 1);
1418 columns = (VisibleButtonCount + rows - 1) / rows;
1419 }
1420 else
1421 {
1422 columns = max(size->cx / cxButton, 1);
1423 rows = (VisibleButtonCount + columns - 1) / columns;
1424 }
1425 size->cx = columns * cxButton;
1426 size->cy = rows * cyButton;
1427#endif
1428}
1429
1431{
1432 NMTBGETINFOTIPW * nmtip = (NMTBGETINFOTIPW *) hdr;
1433 GetTooltipText(nmtip->lParam, nmtip->pszText, nmtip->cchTextMax);
1434 return TRUE;
1435}
1436
1438{
1439 NMCUSTOMDRAW * cdraw = (NMCUSTOMDRAW *) hdr;
1440 switch (cdraw->dwDrawStage)
1441 {
1442 case CDDS_PREPAINT:
1443 return CDRF_NOTIFYITEMDRAW;
1444
1445 case CDDS_ITEMPREPAINT:
1447 }
1448 return TRUE;
1449}
1450
1452{
1453 bHandled = FALSE;
1454
1455 /* Handles the BN_CLICKED notifications sent by the CNotifyToolbar member */
1456 if (HIWORD(wParam) != BN_CLICKED)
1457 return 0;
1458
1459 INT iBtn = LOWORD(wParam);
1460 if (iBtn < 0)
1461 return 0;
1462
1463 InternalIconData* notifyItem = Toolbar.GetItemData(iBtn);
1464
1465 if (!::IsWindow(notifyItem->hWnd))
1466 return 0;
1467
1468 // TODO: Improve keyboard handling by looking whether one presses
1469 // on ENTER, etc..., which roughly translates into "double-clicking".
1470
1471 if (notifyItem->uVersionCopy >= NOTIFYICON_VERSION)
1472 {
1473 /* Use new-style notifications if the notification icon supports them */
1474 ::SendNotifyMessage(notifyItem->hWnd,
1475 notifyItem->uCallbackMessage,
1476 notifyItem->uID,
1477 NIN_SELECT); // TODO: Distinguish with NIN_KEYSELECT
1478 }
1479 else if (lParam == -1)
1480 {
1481 /*
1482 * Otherwise, and only if the icon was selected via the keyboard,
1483 * simulate right-click mouse messages. This is not needed if the
1484 * selection was done by mouse because in this case the mouse
1485 * messages were already sent.
1486 */
1487 ::SendNotifyMessage(notifyItem->hWnd,
1488 notifyItem->uCallbackMessage,
1489 notifyItem->uID,
1490 WM_LBUTTONDOWN); // TODO: Distinguish with double-click WM_LBUTTONDBLCLK
1491 ::SendNotifyMessage(notifyItem->hWnd,
1492 notifyItem->uCallbackMessage,
1493 notifyItem->uID,
1494 WM_LBUTTONUP);
1495 }
1496
1497 return 0;
1498}
1499
1501{
1502 LRESULT Ret = TRUE;
1503 SIZE szClient;
1504 szClient.cx = LOWORD(lParam);
1505 szClient.cy = HIWORD(lParam);
1506
1507 Ret = DefWindowProc(uMsg, wParam, lParam);
1508
1509 if (Toolbar)
1510 {
1511 Toolbar.SetWindowPos(NULL, 0, 0, szClient.cx, szClient.cy, SWP_NOZORDER);
1512 Toolbar.AutoSize();
1513
1514 RECT rc;
1516
1517 SIZE szBar = { rc.right - rc.left, rc.bottom - rc.top };
1518
1519 INT xOff = (szClient.cx - szBar.cx) / 2;
1520 INT yOff = (szClient.cy - szBar.cy) / 2;
1521
1522 Toolbar.SetWindowPos(NULL, xOff, yOff, szBar.cx, szBar.cy, SWP_NOZORDER);
1523 }
1524 return Ret;
1525}
1526
1528{
1529 bHandled = TRUE;
1530 return 0;
1531}
1532
1534{
1536 bHandled = TRUE;
1537 return 0;
1538}
1539
1541{
1543 {
1544 bHandled = TRUE;
1545 }
1546
1547 return 0;
1548}
1549
1551{
1553 if (cpData->dwData == TABDMC_NOTIFY)
1554 {
1555 /* A taskbar NotifyIcon notification */
1556 PTRAYNOTIFYDATAW pData = (PTRAYNOTIFYDATAW)cpData->lpData;
1557 if (pData->dwSignature == NI_NOTIFY_SIG)
1558 return NotifyIcon(pData->dwMessage, &pData->nid);
1559 }
1560 else if (cpData->dwData == TABDMC_LOADINPROC)
1561 {
1562 FIXME("Taskbar Load In Proc\n");
1563 }
1564
1565 return FALSE;
1566}
1567
1569{
1570 if (wParam == SPI_SETNONCLIENTMETRICS)
1571 {
1573 }
1574 return 0;
1575}
1576
1578{
1580 return 0;
1581}
1582
1584{
1585 /* Create the window. The tray window is going to move it to the correct
1586 position and resize it as needed. */
1588 Create(hWndParent, 0, NULL, dwStyle);
1589 if (!m_hWnd)
1590 return E_FAIL;
1591
1592 SetWindowTheme(m_hWnd, L"TrayNotify", NULL);
1593
1594 return S_OK;
1595}
1596
1598{
1599 return ShellObjectCreatorInit<CSysPagerWnd>(hwndParent, riid, ppv);
1600}
HWND hWnd
Definition: settings.c:17
const WCHAR * class
Definition: main.c:68
#define index(s, c)
Definition: various.h:29
@ Create
Definition: registry.c:563
#define TNWM_GETMINIMUMSIZE
Definition: precomp.h:340
TaskbarSettings g_TaskbarSettings
Definition: settings.cpp:23
#define NTNWM_REALIGN
Definition: precomp.h:343
static VOID OnTimer(IN HWND hwndDlg, IN PSYS_SHUTDOWN_PARAMS pShutdownParams)
Definition: shutdown.c:72
#define FIXME(fmt,...)
Definition: debug.h:111
#define WARN(fmt,...)
Definition: debug.h:112
#define ERR(fmt,...)
Definition: debug.h:110
BOOL SetWindowPos(HWND hWndInsertAfter, int x, int y, int cx, int cy, UINT nFlags)
Definition: atlwin.h:1288
HWND SetFocus()
Definition: atlwin.h:1198
LRESULT SendMessage(UINT message, WPARAM wParam=0, LPARAM lParam=0)
Definition: atlwin.h:1116
BOOL GetClientRect(LPRECT lpRect) const
Definition: atlwin.h:541
BOOL GetWindowRect(LPRECT lpRect) const
Definition: atlwin.h:816
CWindow GetParent() const
Definition: atlwin.h:700
HWND m_hWnd
Definition: atlwin.h:273
BOOL ClientToScreen(LPPOINT lpPoint) const
Definition: atlwin.h:393
BOOL IsWindow() const
Definition: atlwin.h:947
static const int MinTimeout
Definition: syspager.cpp:88
HWND m_hwndParent
Definition: syspager.cpp:113
static const int CooldownBetweenBalloons
Definition: syspager.cpp:90
CTooltips * m_tooltips
Definition: syspager.cpp:115
CNotifyToolbar * m_toolbar
Definition: syspager.cpp:119
void RemoveInfo(InternalIconData *notifyItem)
Definition: syspager.cpp:575
void Deinit()
Definition: syspager.cpp:517
bool m_currentClosed
Definition: syspager.cpp:122
InternalIconData * m_current
Definition: syspager.cpp:121
static const int TimerInterval
Definition: syspager.cpp:86
void SetTimer(int length)
Definition: syspager.cpp:609
void UpdateInfo(InternalIconData *notifyItem)
Definition: syspager.cpp:551
void Init(HWND hwndParent, CNotifyToolbar *toolbar, CTooltips *balloons)
Definition: syspager.cpp:510
CAtlList< Info > m_queue
Definition: syspager.cpp:117
void Show(Info &info)
Definition: syspager.cpp:614
void Close(IN OUT InternalIconData *notifyItem, IN UINT uReason)
Definition: syspager.cpp:642
void CloseCurrent()
Definition: syspager.cpp:590
static const int MaxTimeout
Definition: syspager.cpp:89
int IndexOf(InternalIconData *pdata)
Definition: syspager.cpp:598
static const int BalloonsTimerId
Definition: syspager.cpp:87
bool OnTimer(int timerId)
Definition: syspager.cpp:525
HWND m_hwndSysTray
Definition: syspager.cpp:60
bool RemoveIconFromWatcher(_In_ CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:369
bool AddIconToWatcher(_In_ CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:330
virtual ~CIconWatcher()
Definition: syspager.cpp:274
CRITICAL_SECTION m_ListLock
Definition: syspager.cpp:57
bool Initialize(_In_ HWND hWndParent)
Definition: syspager.cpp:285
HANDLE m_WakeUpEvent
Definition: syspager.cpp:59
IconWatcherData * GetListEntry(_In_opt_ CONST NOTIFYICONDATA *iconData, _In_opt_ HANDLE hProcess, _In_ bool Remove)
Definition: syspager.cpp:383
static UINT WINAPI WatcherThread(_In_opt_ LPVOID lpParam)
Definition: syspager.cpp:410
CAtlList< IconWatcherData * > m_WatcherList
Definition: syspager.cpp:56
void Uninitialize()
Definition: syspager.cpp:306
HANDLE m_hWatcherThread
Definition: syspager.cpp:58
BOOL RemoveButton(IN CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:941
BOOL UpdateButton(IN CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:836
HIMAGELIST m_ImageList
Definition: syspager.cpp:148
int GetVisibleButtonCount()
Definition: syspager.cpp:672
LRESULT OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1145
int FindItem(IN HWND hWnd, IN UINT uID, InternalIconData **pdata)
Definition: syspager.cpp:677
int FindExistingSharedIcon(HICON handle)
Definition: syspager.cpp:697
bool SendNotifyCallback(InternalIconData *notifyItem, UINT uMsg)
Definition: syspager.cpp:1076
BOOL AddButton(IN CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:714
LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1028
virtual ~CNotifyToolbar()
Definition: syspager.cpp:668
VOID ResizeImagelist()
Definition: syspager.cpp:994
void Initialize(HWND hWndParent, CBalloonQueue *queue)
Definition: syspager.cpp:1225
BOOL SwitchVersion(IN CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:813
CBalloonQueue * m_BalloonQueue
Definition: syspager.cpp:151
int m_VisibleButtonCount
Definition: syspager.cpp:149
VOID SendMouseEvent(IN WORD wIndex, IN UINT uMsg, IN WPARAM wParam)
Definition: syspager.cpp:1114
LRESULT OnTooltipShow(INT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: syspager.cpp:1172
virtual ~CSysPagerWnd()
Definition: syspager.cpp:1275
LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1451
void GetSize(IN BOOL IsHorizontal, IN PSIZE size)
Definition: syspager.cpp:1387
LRESULT OnGetMinimumSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1577
LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1540
LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1327
LRESULT OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1550
LRESULT OnCustomDraw(INT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: syspager.cpp:1437
CNotifyToolbar Toolbar
Definition: syspager.cpp:193
LRESULT OnSettingChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1568
HRESULT WINAPI ContextSensitiveHelp(BOOL fEnterMode)
Definition: syspager.cpp:226
HRESULT WINAPI GetWindow(HWND *phwnd)
Definition: syspager.cpp:218
BOOL NotifyIcon(DWORD dwMessage, _In_ CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:1334
LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1294
HRESULT Initialize(IN HWND hWndParent)
Definition: syspager.cpp:1583
LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1500
LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1527
LRESULT DrawBackground(HDC hdc)
CTooltips m_Balloons
Definition: syspager.cpp:194
LRESULT OnEraseBackground(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
Definition: syspager.cpp:1277
LRESULT OnBalloonPop(UINT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: syspager.cpp:1533
LRESULT OnGetInfoTip(INT uCode, LPNMHDR hdr, BOOL &bHandled)
Definition: syspager.cpp:1430
CBalloonQueue m_BalloonQueue
Definition: syspager.cpp:195
DWORD AddButton(TBBUTTON *btn)
Definition: rosctrls.h:327
HWND Create(HWND hWndParent, DWORD dwStyles=0, DWORD dwExStyles=0)
Definition: rosctrls.h:256
BOOL AddTool(IN CONST TTTOOLINFOW *pInfo)
Definition: rosctrls.h:637
VOID TrackDeactivate()
Definition: rosctrls.h:723
VOID UpdateTipText(IN HWND hwndToolOwner, IN UINT uId, IN PCWSTR szText, IN HINSTANCE hinstResourceOwner=NULL)
Definition: rosctrls.h:685
BOOL SetTitle(PCWSTR szTitleText, WPARAM icon=0)
Definition: rosctrls.h:710
VOID TrackActivate(IN HWND hwndToolOwner, IN UINT uId)
Definition: rosctrls.h:715
HWND Create(HWND hWndParent, DWORD dwStyles=WS_POPUP|TTS_NOPREFIX, DWORD dwExStyles=WS_EX_TOPMOST)
Definition: rosctrls.h:616
VOID TrackPosition(IN WORD x, IN WORD y)
Definition: rosctrls.h:728
Definition: _queue.h:67
static int OnCommand(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: clipbrd.c:202
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
DWORD WINAPI GetSize(LPVOID)
static HWND hwndParent
Definition: cryptui.c:300
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
ush Pos
Definition: deflate.h:92
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
BOOL WINAPI ImageList_Remove(HIMAGELIST himl, INT i)
Definition: imagelist.c:2568
INT WINAPI ImageList_ReplaceIcon(HIMAGELIST himl, INT nIndex, HICON hIcon)
Definition: imagelist.c:2779
BOOL WINAPI ImageList_Destroy(HIMAGELIST himl)
Definition: imagelist.c:928
HIMAGELIST WINAPI ImageList_Create(INT cx, INT cy, UINT flags, INT cInitial, INT cGrow)
Definition: imagelist.c:804
BOOL WINAPI ImageList_GetIconSize(HIMAGELIST himl, INT *cx, INT *cy)
Definition: imagelist.c:2037
#define CloseHandle
Definition: compat.h:739
HANDLE HWND
Definition: compat.h:19
HANDLE WINAPI OpenProcess(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwProcessId)
Definition: proc.c:1227
const WCHAR * text
Definition: package.c:1799
HRESULT WINAPI DrawThemeParentBackground(HWND hwnd, HDC hdc, RECT *prc)
Definition: draw.c:72
BOOL WINAPI IsAppThemed(void)
Definition: system.c:596
#define pt(x, y)
Definition: drawing.c:79
#define INFINITE
Definition: serial.h:102
PKSAUDIO_DEVICE_ENTRY GetListEntry(IN PLIST_ENTRY Head, IN ULONG Index)
Definition: control.c:45
@ Success
Definition: eventcreate.c:712
static VOID OnSize(HWND hDlg, PDETAILDATA pData, INT cx, INT cy)
Definition: evtdetctl.c:470
IN PLARGE_INTEGER IN PLARGE_INTEGER PEPROCESS ProcessId
Definition: fatprocs.h:2711
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
Status
Definition: gdiplustypes.h:25
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLuint index
Definition: glext.h:6031
GLuint GLsizei GLsizei * length
Definition: glext.h:6040
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
char hdr[14]
Definition: iptest.cpp:33
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
Definition: atlcom.h:679
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:651
#define END_COM_MAP()
Definition: atlcom.h:592
#define MESSAGE_HANDLER(msg, func)
Definition: atlwin.h:1926
#define NOTIFY_CODE_HANDLER(cd, func)
Definition: atlwin.h:1980
#define BEGIN_MSG_MAP(theClass)
Definition: atlwin.h:1898
#define END_MSG_MAP()
Definition: atlwin.h:1917
#define MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func)
Definition: atlwin.h:1935
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
Definition: atlwin.h:2004
if(dx< 0)
Definition: linetemp.h:194
_In_ BOOL _In_ HANDLE hProcess
Definition: mapping.h:71
#define ASSERT(a)
Definition: mode.c:44
HDC hdc
Definition: main.c:9
static BOOL Uninitialize(LPCWSTR lpDriverPath)
Definition: main.c:16
static HDC
Definition: imagelist.c:92
static HICON
Definition: imagelist.c:84
static PROTOCOLDATA * pdata
Definition: protocol.c:158
static VOID SetImageList(HWND hwnd)
Definition: mplay32.c:238
#define _In_
Definition: ms_sal.h:308
#define _In_opt_
Definition: ms_sal.h:309
BOOL OnCreate(HWND hWnd)
Definition: msconfig.c:83
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
unsigned int UINT
Definition: ndis.h:50
#define SYNCHRONIZE
Definition: nt_native.h:61
#define L(x)
Definition: ntvdm.h:50
const GUID IID_IOleWindow
#define false
Definition: osdep.h:35
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define CONST
Definition: pedump.c:81
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define TB_GETTOOLTIPS
Definition: commctrl.h:1138
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
#define TTN_POP
Definition: commctrl.h:1875
#define TTN_SHOW
Definition: commctrl.h:1874
#define CDDS_ITEMPREPAINT
Definition: commctrl.h:285
#define TBIF_IMAGE
Definition: commctrl.h:1219
#define TBSTYLE_TOOLTIPS
Definition: commctrl.h:989
#define TBBUTTONINFO
Definition: commctrl.h:1254
#define TBCDRF_NOEDGES
Definition: commctrl.h:1033
#define CDRF_NOTIFYITEMDRAW
Definition: commctrl.h:275
#define TBCDRF_NOOFFSET
Definition: commctrl.h:1035
#define TOOLINFOW
Definition: commctrl.h:1715
_Out_opt_ int * cx
Definition: commctrl.h:585
#define ILC_COLOR32
Definition: commctrl.h:358
#define TTTOOLINFOW_V1_SIZE
Definition: commctrl.h:1721
#define NM_CUSTOMDRAW
Definition: commctrl.h:137
#define TTF_IDISHWND
Definition: commctrl.h:1764
#define TBCDRF_NOBACKGROUND
Definition: commctrl.h:1040
#define TBSTYLE_TRANSPARENT
Definition: commctrl.h:996
#define CCS_NODIVIDER
Definition: commctrl.h:2248
#define CCS_TOP
Definition: commctrl.h:2242
#define TBMF_BUTTONSPACING
Definition: commctrl.h:1289
#define TTS_ALWAYSTIP
Definition: commctrl.h:1757
#define TBCDRF_NOETCHEDEFFECT
Definition: commctrl.h:1037
#define TBIF_BYINDEX
Definition: commctrl.h:1226
#define TBSTATE_ENABLED
Definition: commctrl.h:974
#define CDDS_PREPAINT
Definition: commctrl.h:280
#define TBSTYLE_FLAT
Definition: commctrl.h:992
#define ImageList_AddIcon(himl, hicon)
Definition: commctrl.h:415
#define TBMF_PAD
Definition: commctrl.h:1287
#define ILC_MASK
Definition: commctrl.h:351
#define CCS_NOPARENTALIGN
Definition: commctrl.h:2246
#define TTS_NOPREFIX
Definition: commctrl.h:1758
#define CCS_NORESIZE
Definition: commctrl.h:2245
#define TBN_GETINFOTIPW
Definition: commctrl.h:1342
#define TBSTYLE_WRAPABLE
Definition: commctrl.h:990
#define TBMF_BARPAD
Definition: commctrl.h:1288
#define BTNS_NOPREFIX
Definition: commctrl.h:1005
#define TTF_TRACK
Definition: commctrl.h:1768
#define TBSTATE_HIDDEN
Definition: commctrl.h:975
#define TBIF_COMMAND
Definition: commctrl.h:1224
#define TTS_CLOSE
Definition: commctrl.h:1762
#define TBIF_STATE
Definition: commctrl.h:1221
#define TBCDRF_NOMARK
Definition: commctrl.h:1036
#define TTS_BALLOON
Definition: commctrl.h:1761
#define REFIID
Definition: guiddef.h:118
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define WM_NOTIFY
Definition: richedit.h:61
#define DefWindowProc
Definition: ros2win.h:31
@ Close
Definition: sacdrv.h:268
_CRTIMP uintptr_t __cdecl _beginthreadex(_In_opt_ void *_Security, _In_ unsigned _StackSize, _In_ unsigned(__stdcall *_StartAddress)(void *), _In_opt_ void *_ArgList, _In_ unsigned _InitFlag, _Out_opt_ unsigned *_ThrdAddr)
#define NIM_DELETE
Definition: shellapi.h:93
NOTIFYICONDATAA NOTIFYICONDATA
Definition: shellapi.h:676
#define NIM_MODIFY
Definition: shellapi.h:92
#define NIF_ICON
Definition: shellapi.h:103
#define NIF_MESSAGE
Definition: shellapi.h:102
#define NIM_ADD
Definition: shellapi.h:91
#define NIF_TIP
Definition: shellapi.h:104
HRESULT hr
Definition: shlfolder.c:183
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
& rect
Definition: startmenu.cpp:1413
#define StringCchCopy
Definition: strsafe.h:139
#define StringCchLength
Definition: strsafe.h:829
Info(InternalIconData *source)
Definition: syspager.cpp:101
WCHAR szInfo[256]
Definition: syspager.cpp:96
WCHAR szInfoTitle[64]
Definition: syspager.cpp:97
InternalIconData * pSource
Definition: syspager.cpp:95
base of all file and directory entries
Definition: entries.h:83
IconWatcherData(CONST NOTIFYICONDATA *iconData)
Definition: syspager.cpp:36
HANDLE hProcess
Definition: syspager.cpp:32
NOTIFYICONDATA IconData
Definition: syspager.cpp:34
Definition: globals.h:96
int cyButtonSpacing
Definition: commctrl.h:1299
int cxButtonSpacing
Definition: commctrl.h:1298
int cxBarPad
Definition: commctrl.h:1296
DWORD dwMask
Definition: commctrl.h:1293
int cyBarPad
Definition: commctrl.h:1297
int cyPad
Definition: commctrl.h:1295
int cxPad
Definition: commctrl.h:1294
BOOL bCompactTrayIcons
Definition: precomp.h:214
CHAR szInfoTitle[64]
Definition: shellapi.h:242
CHAR szInfo[256]
Definition: shellapi.h:237
UINT uCallbackMessage
Definition: shellapi.h:228
DWORD dwInfoFlags
Definition: shellapi.h:243
CHAR szTip[128]
Definition: shellapi.h:234
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
BYTE fsState
Definition: commctrl.h:951
INT_PTR iString
Definition: commctrl.h:959
int idCommand
Definition: commctrl.h:950
DWORD_PTR dwData
Definition: commctrl.h:958
int iBitmap
Definition: commctrl.h:949
BYTE fsStyle
Definition: commctrl.h:952
ULONG_PTR dwData
Definition: winuser.h:2991
RECT rcMonitor
Definition: winuser.h:3775
DWORD cbSize
Definition: winuser.h:3774
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
Definition: dhcpd.h:245
static COORD Position
Definition: mouse.c:34
#define max(a, b)
Definition: svc.c:63
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:751
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
HRESULT CSysPagerWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv)
Definition: syspager.cpp:1597
static VOID GetTooltipText(LPARAM data, LPTSTR szTip, DWORD cchTip)
Definition: syspager.cpp:1159
static const WCHAR szSysPagerWndClass[]
Definition: syspager.cpp:184
#define DWORD_PTR
Definition: treelist.c:76
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
int32_t INT_PTR
Definition: typedefs.h:64
PVOID HANDLE
Definition: typedefs.h:73
int32_t INT
Definition: typedefs.h:58
#define IN
Definition: typedefs.h:39
#define HIWORD(l)
Definition: typedefs.h:247
#define OUT
Definition: typedefs.h:40
#define TABDMC_LOADINPROC
Definition: undocshell.h:762
#define TABDMC_NOTIFY
Definition: undocshell.h:761
HRESULT WINAPI SetWindowTheme(_In_ HWND hwnd, _In_ LPCWSTR pszSubAppName, _In_ LPCWSTR pszSubIdList)
Definition: uxthemesupp.c:69
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
static LRESULT OnDestroy(HWND hWnd, WPARAM wParam, LPARAM lParam)
Definition: welcome.c:1552
#define ZeroMemory
Definition: winbase.h:1700
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
#define MAXIMUM_WAIT_OBJECTS
Definition: winbase.h:404
DWORD WINAPI GetCurrentProcessId(void)
Definition: proc.c:1158
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define CopyMemory
Definition: winbase.h:1698
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define WAIT_OBJECT_0
Definition: winbase.h:406
#define WAIT_FAILED
Definition: winbase.h:413
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
Definition: winddi.h:3837
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 SubclassWindow(hwnd, lpfn)
Definition: windowsx.h:542
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define WM_ERASEBKGND
Definition: winuser.h:1615
#define GetMonitorInfo
Definition: winuser.h:5781
#define SetWindowLong
Definition: winuser.h:5843
#define SWP_NOACTIVATE
Definition: winuser.h:1232
BOOL WINAPI SendNotifyMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_MOUSEFIRST
Definition: winuser.h:1764
#define GA_ROOT
Definition: winuser.h:2779
#define WM_MOUSELAST
Definition: winuser.h:1791
#define WM_CREATE
Definition: winuser.h:1598
#define WM_SIZE
Definition: winuser.h:1601
#define HWND_BROADCAST
Definition: winuser.h:1194
struct tagCOPYDATASTRUCT * PCOPYDATASTRUCT
#define WM_COMMAND
Definition: winuser.h:1730
#define WM_RBUTTONUP
Definition: winuser.h:1770
#define SM_CYSMICON
Definition: winuser.h:1007
#define SWP_NOSIZE
Definition: winuser.h:1235
#define CS_DBLCLKS
Definition: winuser.h:646
#define WM_LBUTTONDOWN
Definition: winuser.h:1766
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:656
#define WM_RBUTTONDOWN
Definition: winuser.h:1769
#define WM_SETTINGCHANGE
Definition: winuser.h:1619
#define SM_CXSMICON
Definition: winuser.h:1006
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
#define WM_TIMER
Definition: winuser.h:1732
#define WM_COPYDATA
Definition: winuser.h:1654
#define SendMessage
Definition: winuser.h:5833
UINT WINAPI RegisterWindowMessageW(_In_ LPCWSTR)
#define GetWindowLong
Definition: winuser.h:5786
#define WM_LBUTTONUP
Definition: winuser.h:1767
#define PostMessage
Definition: winuser.h:5822
#define BN_CLICKED
Definition: winuser.h:1915
#define WM_DESTROY
Definition: winuser.h:1599
#define SWP_NOZORDER
Definition: winuser.h:1237
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)
#define GWL_STYLE
Definition: winuser.h:846
#define SendNotifyMessage
Definition: winuser.h:5836
int WINAPI GetSystemMetrics(_In_ int)
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define COLOR_3DFACE
Definition: winuser.h:923
_In_ BOOLEAN Remove
Definition: psfuncs.h:110
static void Initialize()
Definition: xlate.c:212
__wchar_t WCHAR
Definition: xmlstorage.h:180
CHAR * LPTSTR
Definition: xmlstorage.h:192
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
#define const
Definition: zconf.h:233