1 /* Unit tests for systray 2 * 3 * Copyright 2007 Mikolaj Zalewski 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 18 */ 19 20 #include <stdarg.h> 21 22 #include <windows.h> 23 #include "shellapi.h" 24 25 #include "wine/test.h" 26 27 28 static HWND hMainWnd; 29 static BOOL (WINAPI *pShell_NotifyIconW)(DWORD,PNOTIFYICONDATAW); 30 31 static void test_cbsize(void) 32 { 33 NOTIFYICONDATAA nidA; 34 BOOL ret; 35 36 if (pShell_NotifyIconW) 37 { 38 NOTIFYICONDATAW nidW; 39 40 ZeroMemory(&nidW, sizeof(nidW)); 41 nidW.cbSize = NOTIFYICONDATAW_V1_SIZE; 42 nidW.hWnd = hMainWnd; 43 nidW.uID = 1; 44 nidW.uFlags = NIF_ICON|NIF_MESSAGE; 45 nidW.hIcon = LoadIconA(NULL, (LPSTR)IDI_APPLICATION); 46 nidW.uCallbackMessage = WM_USER+17; 47 ret = pShell_NotifyIconW(NIM_ADD, &nidW); 48 ok(ret, "NIM_ADD failed!\n"); 49 /* using an invalid cbSize does work */ 50 nidW.cbSize = 3; 51 nidW.hWnd = hMainWnd; 52 nidW.uID = 1; 53 ret = pShell_NotifyIconW(NIM_DELETE, &nidW); 54 ok( ret || broken(!ret), /* nt4 */ "NIM_DELETE failed!\n"); 55 /* as icon doesn't exist anymore - now there will be an error */ 56 nidW.cbSize = sizeof(nidW); 57 ok(!pShell_NotifyIconW(NIM_DELETE, &nidW) != !ret, "The icon was not deleted\n"); 58 } 59 60 /* same for Shell_NotifyIconA */ 61 ZeroMemory(&nidA, sizeof(nidA)); 62 nidA.cbSize = NOTIFYICONDATAA_V1_SIZE; 63 nidA.hWnd = hMainWnd; 64 nidA.uID = 1; 65 nidA.uFlags = NIF_ICON|NIF_MESSAGE; 66 nidA.hIcon = LoadIconA(NULL, (LPSTR)IDI_APPLICATION); 67 nidA.uCallbackMessage = WM_USER+17; 68 ok(Shell_NotifyIconA(NIM_ADD, &nidA), "NIM_ADD failed!\n"); 69 70 /* using an invalid cbSize does work */ 71 nidA.cbSize = 3; 72 nidA.hWnd = hMainWnd; 73 nidA.uID = 1; 74 ret = Shell_NotifyIconA(NIM_DELETE, &nidA); 75 ok(ret, "NIM_DELETE failed!\n"); 76 /* as icon doesn't exist anymore - now there will be an error */ 77 nidA.cbSize = sizeof(nidA); 78 ok(!Shell_NotifyIconA(NIM_DELETE, &nidA) != !ret, "The icon was not deleted\n"); 79 } 80 81 START_TEST(systray) 82 { 83 WNDCLASSA wc; 84 MSG msg; 85 RECT rc; 86 HMODULE hshell32; 87 88 hshell32 = GetModuleHandleA("shell32.dll"); 89 pShell_NotifyIconW = (void*)GetProcAddress(hshell32, "Shell_NotifyIconW"); 90 91 wc.style = CS_HREDRAW | CS_VREDRAW; 92 wc.cbClsExtra = 0; 93 wc.cbWndExtra = 0; 94 wc.hInstance = GetModuleHandleA(NULL); 95 wc.hIcon = NULL; 96 wc.hCursor = LoadCursorA(NULL, (LPSTR)IDC_IBEAM); 97 wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW); 98 wc.lpszMenuName = NULL; 99 wc.lpszClassName = "MyTestWnd"; 100 wc.lpfnWndProc = DefWindowProcA; 101 RegisterClassA(&wc); 102 103 hMainWnd = CreateWindowExA(0, "MyTestWnd", "Blah", WS_OVERLAPPEDWINDOW, 104 CW_USEDEFAULT, CW_USEDEFAULT, 680, 260, NULL, NULL, GetModuleHandleA(NULL), 0); 105 GetClientRect(hMainWnd, &rc); 106 ShowWindow(hMainWnd, SW_SHOW); 107 108 test_cbsize(); 109 110 PostQuitMessage(0); 111 while(GetMessageA(&msg,0,0,0)) { 112 TranslateMessage(&msg); 113 DispatchMessageA(&msg); 114 } 115 DestroyWindow(hMainWnd); 116 } 117