2 * PROJECT: ReactOS Applications Manager
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: base/applications/rapps/winmain.c
5 * PURPOSE: Main program
6 * PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
15 HIMAGELIST hImageTreeView
= NULL
;
16 INT SelectedEnumType
= ENUM_ALL_COMPONENTS
;
17 SETTINGS_INFO SettingsInfo
;
20 FillDefaultSettings(PSETTINGS_INFO pSettingsInfo
)
22 pSettingsInfo
->bSaveWndPos
= TRUE
;
23 pSettingsInfo
->bUpdateAtStart
= FALSE
;
24 pSettingsInfo
->bLogEnabled
= TRUE
;
25 wcscpy(pSettingsInfo
->szDownloadDir
, L
"C:\\Downloads");
26 pSettingsInfo
->bDelInstaller
= FALSE
;
28 pSettingsInfo
->Maximized
= FALSE
;
29 pSettingsInfo
->Left
= 0;
30 pSettingsInfo
->Top
= 0;
31 pSettingsInfo
->Right
= 680;
32 pSettingsInfo
->Bottom
= 450;
41 if (RegOpenKeyExW(HKEY_LOCAL_MACHINE
, L
"Software\\ReactOS\\rapps", 0, KEY_READ
, &hKey
) == ERROR_SUCCESS
)
43 dwSize
= sizeof(SETTINGS_INFO
);
44 if (RegQueryValueExW(hKey
, L
"Settings", NULL
, NULL
, (LPBYTE
)&SettingsInfo
, &dwSize
) == ERROR_SUCCESS
)
57 SaveSettings(HWND hwnd
)
62 if (SettingsInfo
.bSaveWndPos
)
64 wp
.length
= sizeof(WINDOWPLACEMENT
);
65 GetWindowPlacement(hwnd
, &wp
);
67 SettingsInfo
.Left
= wp
.rcNormalPosition
.left
;
68 SettingsInfo
.Top
= wp
.rcNormalPosition
.top
;
69 SettingsInfo
.Right
= wp
.rcNormalPosition
.right
;
70 SettingsInfo
.Bottom
= wp
.rcNormalPosition
.bottom
;
71 SettingsInfo
.Maximized
= (IsZoomed(hwnd
) || (wp
.flags
& WPF_RESTORETOMAXIMIZED
));
74 if (RegCreateKeyExW(HKEY_LOCAL_MACHINE
, L
"Software\\ReactOS\\rapps", 0, NULL
,
75 REG_OPTION_NON_VOLATILE
, KEY_WRITE
, NULL
, &hKey
, NULL
) == ERROR_SUCCESS
)
77 RegSetValueExW(hKey
, L
"Settings", 0, REG_BINARY
, (LPBYTE
)&SettingsInfo
, sizeof(SETTINGS_INFO
));
83 FreeInstalledAppList(VOID
)
85 INT Count
= ListView_GetItemCount(hListView
) - 1;
90 Info
= ListViewGetlParam(Count
);
93 RegCloseKey(Info
->hSubKey
);
94 HeapFree(GetProcessHeap(), 0, Info
);
102 EnumInstalledAppProc(INT ItemIndex
, LPWSTR lpName
, INSTALLED_INFO Info
)
104 PINSTALLED_INFO ItemInfo
;
105 WCHAR szText
[MAX_PATH
];
108 ItemInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(INSTALLED_INFO
));
109 if (!ItemInfo
) return FALSE
;
113 Index
= ListViewAddItem(ItemIndex
, 0, lpName
, (LPARAM
)ItemInfo
);
115 /* Get version info */
116 GetApplicationString((HKEY
)ItemInfo
->hSubKey
, L
"DisplayVersion", szText
);
117 ListView_SetItemText(hListView
, Index
, 1, szText
);
119 GetApplicationString((HKEY
)ItemInfo
->hSubKey
, L
"Comments", szText
);
120 ListView_SetItemText(hListView
, Index
, 2, szText
);
126 FreeAvailableAppList(VOID
)
128 INT Count
= ListView_GetItemCount(hListView
) - 1;
133 Info
= ListViewGetlParam(Count
);
135 HeapFree(GetProcessHeap(), 0, Info
);
142 EnumAvailableAppProc(APPLICATION_INFO Info
)
144 PAPPLICATION_INFO ItemInfo
;
147 /* Only add a ListView entry if...
148 - no RegName was supplied (so we cannot determine whether the application is installed or not) or
149 - a RegName was supplied and the application is not installed
151 if (!*Info
.szRegName
|| (!IsInstalledApplication(Info
.szRegName
, FALSE
) && !IsInstalledApplication(Info
.szRegName
, TRUE
)))
153 ItemInfo
= HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_INFO
));
154 if (!ItemInfo
) return FALSE
;
158 Index
= ListViewAddItem(Info
.Category
, 0, Info
.szName
, (LPARAM
)ItemInfo
);
159 ListView_SetItemText(hListView
, Index
, 1, Info
.szVersion
);
160 ListView_SetItemText(hListView
, Index
, 2, Info
.szDesc
);
167 UpdateApplicationsList(INT EnumType
)
169 WCHAR szBuffer1
[MAX_STR_LEN
], szBuffer2
[MAX_STR_LEN
];
171 HIMAGELIST hImageListView
;
173 (VOID
) ListView_DeleteAllItems(hListView
);
175 /* Create image list */
176 hImageListView
= ImageList_Create(LISTVIEW_ICON_SIZE
,
178 GetSystemColorDepth() | ILC_MASK
,
181 hIcon
= LoadImage(hInst
,
182 MAKEINTRESOURCE(IDI_MAIN
),
186 LR_CREATEDIBSECTION
);
188 ImageList_AddIcon(hImageListView
, hIcon
);
191 if (EnumType
== -1) EnumType
= SelectedEnumType
;
193 if (IS_INSTALLED_ENUM(SelectedEnumType
))
194 FreeInstalledAppList();
195 else if (IS_AVAILABLE_ENUM(SelectedEnumType
))
196 FreeAvailableAppList();
198 if (IS_INSTALLED_ENUM(EnumType
))
200 /* Enum installed applications and updates */
201 EnumInstalledApplications(EnumType
, TRUE
, EnumInstalledAppProc
);
202 EnumInstalledApplications(EnumType
, FALSE
, EnumInstalledAppProc
);
204 else if (IS_AVAILABLE_ENUM(EnumType
))
206 /* Enum availabled applications */
207 EnumAvailableApplications(EnumType
, EnumAvailableAppProc
);
210 /* Set image list for ListView */
211 hImageListView
= ListView_SetImageList(hListView
, hImageListView
, LVSIL_SMALL
);
213 /* Destroy old image list */
215 ImageList_Destroy(hImageListView
);
217 SelectedEnumType
= EnumType
;
219 LoadStringW(hInst
, IDS_APPS_COUNT
, szBuffer2
, sizeof(szBuffer2
) / sizeof(WCHAR
));
220 swprintf(szBuffer1
, szBuffer2
, ListView_GetItemCount(hListView
));
221 SetStatusBarText(szBuffer1
);
227 InitApplicationsList(VOID
)
229 WCHAR szText
[MAX_STR_LEN
];
231 /* Add columns to ListView */
232 LoadStringW(hInst
, IDS_APP_NAME
, szText
, sizeof(szText
) / sizeof(WCHAR
));
233 ListViewAddColumn(0, szText
, 200, LVCFMT_LEFT
);
235 LoadStringW(hInst
, IDS_APP_INST_VERSION
, szText
, sizeof(szText
) / sizeof(WCHAR
));
236 ListViewAddColumn(1, szText
, 90, LVCFMT_RIGHT
);
238 LoadStringW(hInst
, IDS_APP_DESCRIPTION
, szText
, sizeof(szText
) / sizeof(WCHAR
));
239 ListViewAddColumn(3, szText
, 250, LVCFMT_LEFT
);
241 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
245 AddCategory(HTREEITEM hRootItem
, UINT TextIndex
, UINT IconIndex
)
247 WCHAR szText
[MAX_STR_LEN
];
251 hIcon
= LoadImage(hInst
,
252 MAKEINTRESOURCE(IconIndex
),
256 LR_CREATEDIBSECTION
);
258 Index
= ImageList_AddIcon(hImageTreeView
, hIcon
);
261 LoadStringW(hInst
, TextIndex
, szText
, sizeof(szText
) / sizeof(TCHAR
));
263 return TreeViewAddItem(hRootItem
, szText
, Index
, Index
, TextIndex
);
267 InitCategoriesList(VOID
)
269 HTREEITEM hRootItem1
, hRootItem2
;
271 /* Create image list */
272 hImageTreeView
= ImageList_Create(TREEVIEW_ICON_SIZE
,
274 GetSystemColorDepth() | ILC_MASK
,
277 hRootItem1
= AddCategory(TVI_ROOT
, IDS_INSTALLED
, IDI_CATEGORY
);
278 AddCategory(hRootItem1
, IDS_APPLICATIONS
, IDI_APPS
);
279 AddCategory(hRootItem1
, IDS_UPDATES
, IDI_APPUPD
);
281 hRootItem2
= AddCategory(TVI_ROOT
, IDS_AVAILABLEFORINST
, IDI_CATEGORY
);
282 AddCategory(hRootItem2
, IDS_CAT_AUDIO
, IDI_CAT_AUDIO
);
283 AddCategory(hRootItem2
, IDS_CAT_VIDEO
, IDI_CAT_VIDEO
);
284 AddCategory(hRootItem2
, IDS_CAT_GRAPHICS
, IDI_CAT_GRAPHICS
);
285 AddCategory(hRootItem2
, IDS_CAT_GAMES
, IDI_CAT_GAMES
);
286 AddCategory(hRootItem2
, IDS_CAT_INTERNET
, IDI_CAT_INTERNET
);
287 AddCategory(hRootItem2
, IDS_CAT_OFFICE
, IDI_CAT_OFFICE
);
288 AddCategory(hRootItem2
, IDS_CAT_DEVEL
, IDI_CAT_DEVEL
);
289 AddCategory(hRootItem2
, IDS_CAT_EDU
, IDI_CAT_EDU
);
290 AddCategory(hRootItem2
, IDS_CAT_ENGINEER
, IDI_CAT_ENGINEER
);
291 AddCategory(hRootItem2
, IDS_CAT_FINANCE
, IDI_CAT_FINANCE
);
292 AddCategory(hRootItem2
, IDS_CAT_SCIENCE
, IDI_CAT_SCIENCE
);
293 AddCategory(hRootItem2
, IDS_CAT_TOOLS
, IDI_CAT_TOOLS
);
294 AddCategory(hRootItem2
, IDS_CAT_DRIVERS
, IDI_CAT_DRIVERS
);
295 AddCategory(hRootItem2
, IDS_CAT_LIBS
, IDI_CAT_LIBS
);
296 AddCategory(hRootItem2
, IDS_CAT_OTHER
, IDI_CAT_OTHER
);
298 (VOID
) TreeView_SetImageList(hTreeView
, hImageTreeView
, TVSIL_NORMAL
);
300 (VOID
) TreeView_Expand(hTreeView
, hRootItem2
, TVE_EXPAND
);
301 (VOID
) TreeView_Expand(hTreeView
, hRootItem1
, TVE_EXPAND
);
303 (VOID
) TreeView_SelectItem(hTreeView
, hRootItem1
);
307 InitControls(HWND hwnd
)
309 if (SettingsInfo
.bSaveWndPos
)
311 MoveWindow(hwnd
, SettingsInfo
.Left
, SettingsInfo
.Top
,
312 SettingsInfo
.Right
- SettingsInfo
.Left
,
313 SettingsInfo
.Bottom
- SettingsInfo
.Top
, TRUE
);
315 if (SettingsInfo
.Maximized
) ShowWindow(hwnd
, SW_MAXIMIZE
);
318 if (CreateStatusBar(hwnd
) &&
319 CreateToolBar(hwnd
) &&
320 CreateListView(hwnd
) &&
321 CreateTreeView(hwnd
) &&
322 CreateRichEdit(hwnd
) &&
323 CreateVSplitBar(hwnd
) &&
324 CreateHSplitBar(hwnd
))
326 WCHAR szBuffer1
[MAX_STR_LEN
], szBuffer2
[MAX_STR_LEN
];
328 InitApplicationsList();
330 InitCategoriesList();
332 LoadStringW(hInst
, IDS_APPS_COUNT
, szBuffer2
, sizeof(szBuffer2
) / sizeof(WCHAR
));
333 swprintf(szBuffer1
, szBuffer2
, ListView_GetItemCount(hListView
));
334 SetStatusBarText(szBuffer1
);
342 MainWndOnCommand(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
344 WORD wCommand
= LOWORD(wParam
);
346 if (lParam
== (LPARAM
)hSearchBar
)
348 WCHAR szBuf
[MAX_STR_LEN
];
350 switch (HIWORD(wParam
))
354 WCHAR szWndText
[MAX_STR_LEN
];
356 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
357 GetWindowTextW(hSearchBar
, szWndText
, MAX_STR_LEN
);
358 if (wcscmp(szBuf
, szWndText
) == 0) SetWindowTextW(hSearchBar
, L
"");
364 GetWindowTextW(hSearchBar
, szBuf
, MAX_STR_LEN
);
365 if (wcslen(szBuf
) < 1)
367 LoadStringW(hInst
, IDS_SEARCH_TEXT
, szBuf
, sizeof(szBuf
) / sizeof(WCHAR
));
368 SetWindowTextW(hSearchBar
, szBuf
);
374 /* TODO: Implement search */
384 ShellExecuteW(hwnd
, L
"open", pLink
, NULL
, NULL
, SW_SHOWNOACTIVATE
);
385 HeapFree(GetProcessHeap(), 0, pLink
);
389 CopyTextToClipboard(pLink
);
390 HeapFree(GetProcessHeap(), 0, pLink
);
394 CreateSettingsDlg(hwnd
);
398 PostMessageW(hwnd
, WM_CLOSE
, 0, 0);
402 if (DownloadApplication(-1))
403 /* TODO: Implement install dialog
404 * if (InstallApplication(-1))
406 UpdateApplicationsList(-1);
410 if (UninstallApplication(-1, FALSE
))
411 UpdateApplicationsList(-1);
415 if (UninstallApplication(-1, TRUE
))
416 UpdateApplicationsList(-1);
420 RemoveAppFromRegistry(-1);
424 UpdateApplicationsList(-1);
429 UpdateApplicationsList(-1);
433 MessageBoxW(hwnd
, L
"Help not implemented yet", NULL
, MB_OK
);
443 MainWndOnSize(HWND hwnd
, WPARAM wParam
, LPARAM lParam
)
445 HDWP hdwp
= BeginDeferWindowPos(5);
446 INT SearchBarWidth
= GetWindowWidth(hSearchBar
);
447 INT RichPos
= GetWindowHeight(hRichEdit
);
448 INT NewPos
= HIWORD(lParam
) - (RichPos
+ SPLIT_WIDTH
+ GetWindowHeight(hStatusBar
));
451 /* Size status bar */
452 SendMessage(hStatusBar
, WM_SIZE
, 0, 0);
455 SendMessage(hToolBar
, TB_AUTOSIZE
, 0, 0);
458 MoveWindow(hSearchBar
, LOWORD(lParam
) - SearchBarWidth
- 4, 5, SearchBarWidth
, 22, TRUE
);
461 * HIWORD(lParam) - Height of main window
462 * LOWORD(lParam) - Width of main window
465 /* Size vertical splitter bar */
469 (VSplitterPos
= GetWindowWidth(hTreeView
)),
470 GetWindowHeight(hToolBar
),
472 HIWORD(lParam
) - GetWindowHeight(hToolBar
) - GetWindowHeight(hStatusBar
),
473 SWP_NOZORDER
|SWP_NOACTIVATE
);
480 GetWindowHeight(hToolBar
),
482 HIWORD(lParam
) - GetWindowHeight(hToolBar
) - GetWindowHeight(hStatusBar
),
483 SWP_NOZORDER
|SWP_NOACTIVATE
);
485 while (NewPos
< SPLIT_WIDTH
+ GetWindowHeight(hToolBar
))
488 NewPos
= HIWORD(lParam
) - (RichPos
+
489 SPLIT_WIDTH
+ GetWindowHeight(hStatusBar
));
491 SetHSplitterPos(NewPos
);
497 VSplitterPos
+ SPLIT_WIDTH
,
498 GetWindowHeight(hToolBar
),
499 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
500 GetHSplitterPos() - GetWindowHeight(hToolBar
),
501 SWP_NOZORDER
|SWP_NOACTIVATE
);
507 VSplitterPos
+ SPLIT_WIDTH
,
508 GetHSplitterPos() + SPLIT_WIDTH
,
509 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
511 SWP_NOZORDER
|SWP_NOACTIVATE
);
513 /* Size horizontal splitter bar */
517 VSplitterPos
+ SPLIT_WIDTH
,
519 LOWORD(lParam
) - (VSplitterPos
+ SPLIT_WIDTH
),
521 SWP_NOZORDER
|SWP_NOACTIVATE
);
523 EndDeferWindowPos(hdwp
);
527 MainWindowProc(HWND hwnd
, UINT Msg
, WPARAM wParam
, LPARAM lParam
)
532 if (!InitControls(hwnd
))
533 PostMessage(hwnd
, WM_CLOSE
, 0, 0);
535 if (SettingsInfo
.bUpdateAtStart
)
540 MainWndOnCommand(hwnd
, wParam
, lParam
);
545 LPNMHDR data
= (LPNMHDR
)lParam
;
551 if (data
->hwndFrom
== hTreeView
)
553 switch (((LPNMTREEVIEW
)lParam
)->itemNew
.lParam
)
556 UpdateApplicationsList(ENUM_ALL_COMPONENTS
);
559 case IDS_APPLICATIONS
:
560 UpdateApplicationsList(ENUM_APPLICATIONS
);
564 UpdateApplicationsList(ENUM_UPDATES
);
567 case IDS_AVAILABLEFORINST
:
568 UpdateApplicationsList(ENUM_ALL_AVAILABLE
);
572 UpdateApplicationsList(ENUM_CAT_AUDIO
);
576 UpdateApplicationsList(ENUM_CAT_DEVEL
);
579 case IDS_CAT_DRIVERS
:
580 UpdateApplicationsList(ENUM_CAT_DRIVERS
);
584 UpdateApplicationsList(ENUM_CAT_EDU
);
587 case IDS_CAT_ENGINEER
:
588 UpdateApplicationsList(ENUM_CAT_ENGINEER
);
591 case IDS_CAT_FINANCE
:
592 UpdateApplicationsList(ENUM_CAT_FINANCE
);
596 UpdateApplicationsList(ENUM_CAT_GAMES
);
599 case IDS_CAT_GRAPHICS
:
600 UpdateApplicationsList(ENUM_CAT_GRAPHICS
);
603 case IDS_CAT_INTERNET
:
604 UpdateApplicationsList(ENUM_CAT_INTERNET
);
608 UpdateApplicationsList(ENUM_CAT_LIBS
);
612 UpdateApplicationsList(ENUM_CAT_OFFICE
);
616 UpdateApplicationsList(ENUM_CAT_OTHER
);
619 case IDS_CAT_SCIENCE
:
620 UpdateApplicationsList(ENUM_CAT_SCIENCE
);
624 UpdateApplicationsList(ENUM_CAT_TOOLS
);
628 UpdateApplicationsList(ENUM_CAT_VIDEO
);
635 case LVN_ITEMCHANGED
:
637 LPNMLISTVIEW pnic
= (LPNMLISTVIEW
) lParam
;
639 if (pnic
->hdr
.hwndFrom
== hListView
)
641 /* Check if this is a valid item
642 * (technically, it can be also an unselect) */
643 INT ItemIndex
= pnic
->iItem
;
644 if (ItemIndex
== -1 ||
645 ItemIndex
>= ListView_GetItemCount(pnic
->hdr
.hwndFrom
))
650 /* Check if the focus has been moved to another item */
651 if ((pnic
->uChanged
& LVIF_STATE
) &&
652 (pnic
->uNewState
& LVIS_FOCUSED
) &&
653 !(pnic
->uOldState
& LVIS_FOCUSED
))
655 if (IS_INSTALLED_ENUM(SelectedEnumType
))
656 ShowInstalledAppInfo(ItemIndex
);
657 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
658 ShowAvailableAppInfo(ItemIndex
);
664 case LVN_COLUMNCLICK
:
666 LPNMLISTVIEW pnmv
= (LPNMLISTVIEW
) lParam
;
668 (VOID
) ListView_SortItems(hListView
, ListViewCompareFunc
, pnmv
->iSubItem
);
669 bAscending
= !bAscending
;
674 if (data
->hwndFrom
== hListView
)
676 if (IS_INSTALLED_ENUM(SelectedEnumType
))
677 ShowInstalledAppInfo(-1);
678 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
679 ShowAvailableAppInfo(-1);
684 if (data
->hwndFrom
== hListView
)
685 ShowPopupMenu(hListView
, IDR_APPLICATIONMENU
);
689 RichEditOnLink(hwnd
, (ENLINK
*)lParam
);
692 case TTN_GETDISPINFO
:
693 ToolBarOnGetDispInfo((LPTOOLTIPTEXT
)lParam
);
704 if ((GetClientWindowHeight(hMainWnd
) - GetWindowHeight(hStatusBar
) - SPLIT_WIDTH
) < GetHSplitterPos())
706 INT NewSplitPos
= GetClientWindowHeight(hwnd
) - 100 - GetWindowHeight(hStatusBar
) - SPLIT_WIDTH
;
707 if (NewSplitPos
> GetWindowHeight(hToolBar
) + SPLIT_WIDTH
)
708 SetHSplitterPos(NewSplitPos
);
711 MainWndOnSize(hwnd
, wParam
, lParam
);
717 int RichEditHeight
= GetWindowHeight(hRichEdit
);
718 LPRECT pRect
= (LPRECT
)lParam
;
720 while (RichEditHeight
<= 100)
722 if (GetHSplitterPos() - 1 < GetWindowHeight(hToolBar
) + GetWindowHeight(hListView
) + SPLIT_WIDTH
)
724 SetHSplitterPos(GetHSplitterPos() - 1);
728 if (pRect
->right
-pRect
->left
< 565)
729 pRect
->right
= pRect
->left
+ 565;
731 if (pRect
->bottom
-pRect
->top
< 300)
732 pRect
->bottom
= pRect
->top
+ 300;
736 case WM_SYSCOLORCHANGE
:
738 /* Forward WM_SYSCOLORCHANGE to common controls */
739 SendMessage(hListView
, WM_SYSCOLORCHANGE
, 0, 0);
740 SendMessage(hTreeView
, WM_SYSCOLORCHANGE
, 0, 0);
741 SendMessage(hToolBar
, WM_SYSCOLORCHANGE
, 0, 0);
742 SendMessageW(hRichEdit
, EM_SETBKGNDCOLOR
, 0, GetSysColor(COLOR_BTNFACE
));
748 ShowWindow(hwnd
, SW_HIDE
);
753 if (IS_AVAILABLE_ENUM(SelectedEnumType
))
754 FreeAvailableAppList();
755 if (IS_INSTALLED_ENUM(SelectedEnumType
))
756 FreeInstalledAppList();
757 if (hImageTreeView
) ImageList_Destroy(hImageTreeView
);
765 return DefWindowProc(hwnd
, Msg
, wParam
, lParam
);
769 wWinMain(HINSTANCE hInstance
, HINSTANCE hPrevInstance
, LPWSTR lpCmdLine
, int nShowCmd
)
771 WNDCLASSEXW WndClass
= {0};
772 WCHAR szWindowClass
[] = L
"ROSAPPMGR";
773 WCHAR szWindowName
[MAX_STR_LEN
];
774 WCHAR szErrorText
[MAX_STR_LEN
];
775 HANDLE hMutex
= NULL
;
778 switch (GetUserDefaultUILanguage())
780 case MAKELANGID(LANG_HEBREW
, SUBLANG_DEFAULT
):
781 SetProcessDefaultLayout(LAYOUT_RTL
);
790 hMutex
= CreateMutexW(NULL
, FALSE
, szWindowClass
);
791 if ((!hMutex
) || (GetLastError() == ERROR_ALREADY_EXISTS
))
793 /* If already started, it is found its window */
794 HWND hWindow
= FindWindowW(szWindowClass
, NULL
);
796 /* Activate window */
797 ShowWindow(hWindow
, SW_SHOWNORMAL
);
798 SetForegroundWindow(hWindow
);
804 FillDefaultSettings(&SettingsInfo
);
809 InitCommonControls();
811 /* Create the window */
812 WndClass
.cbSize
= sizeof(WNDCLASSEXW
);
813 WndClass
.lpszClassName
= szWindowClass
;
814 WndClass
.lpfnWndProc
= MainWindowProc
;
815 WndClass
.hInstance
= hInstance
;
816 WndClass
.hIcon
= LoadIcon(hInstance
, MAKEINTRESOURCE(IDI_MAIN
));
817 WndClass
.hCursor
= LoadCursor(NULL
, IDC_ARROW
);
818 WndClass
.hbrBackground
= (HBRUSH
)(COLOR_BTNFACE
+ 1);
819 WndClass
.lpszMenuName
= MAKEINTRESOURCEW(IDR_MAINMENU
);
821 if (RegisterClassExW(&WndClass
) == (ATOM
)0) goto Exit
;
823 LoadStringW(hInst
, IDS_APPTITLE
, szWindowName
, sizeof(szWindowName
) / sizeof(WCHAR
));
825 hMainWnd
= CreateWindowExW(WS_EX_WINDOWEDGE
,
828 WS_OVERLAPPEDWINDOW
| WS_CLIPCHILDREN
| WS_CLIPSIBLINGS
,
838 if (!hMainWnd
) goto Exit
;
841 ShowWindow(hMainWnd
, SW_SHOW
);
842 UpdateWindow(hMainWnd
);
845 while (GetMessage(&Msg
, NULL
, 0, 0))
847 TranslateMessage(&Msg
);
848 DispatchMessage(&Msg
);
852 if (hMutex
) CloseHandle(hMutex
);