Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

353 lines
9.4 KiB

/*++
Copyright (c) 2001 Microsoft Corporation
Module Name:
Main.cpp
Abstract:
Implements the entry point and message
pump for the application
Notes:
Unicode only
History:
05/04/2001 rparsons Created
--*/
#include "precomp.h"
// Disable warning about possible loss of data
#pragma warning (disable : 4244)
APPINFO g_ai;
/*++
Routine Description:
Application entry point
Arguments:
hInstance - App instance handle
hPrevInstance - Always NULL
lpCmdLine - Pointer to the command line
nCmdShow - Window show flag
Return Value:
The wParam of the message or 0 on failure
--*/
int
CALLBACK
WinMain(
IN HINSTANCE hInstance,
IN HINSTANCE hPrevInstance,
IN LPSTR lpCmdLine,
IN int nCmdShow
)
{
MSG msg;
WNDCLASS wndclass;
WCHAR wszError[MAX_PATH];
RECT rcDesktop;
RECT rcDialog;
INITCOMMONCONTROLSEX icex;
POINT pt;
HANDLE hMutex;
UNREFERENCED_PARAMETER(lpCmdLine);
UNREFERENCED_PARAMETER(hPrevInstance);
g_ai.hInstance = hInstance;
//
// Make sure we're the only instance running
//
hMutex = CreateMutex(NULL, FALSE, L"ShimViewer");
if (ERROR_ALREADY_EXISTS == GetLastError()) {
return 0;
}
wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc = (WNDPROC) MainWndProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = DLGWINDOWEXTRA;
wndclass.hInstance = hInstance;
wndclass.hIcon = NULL;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground = (HBRUSH) (COLOR_BTNFACE+1);
wndclass.lpszMenuName = NULL;
wndclass.lpszClassName = APP_CLASS;
if (!RegisterClass(&wndclass))
{
LoadString(hInstance, IDS_NO_CLASS, wszError, sizeof(wszError));
MessageBox(NULL, wszError, APP_NAME, MB_OK | MB_ICONERROR);
return 0;
}
//
// Set up the common controls
//
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_LISTVIEW_CLASSES;
if (!InitCommonControlsEx(&icex)) {
InitCommonControls();
}
//
// Get application settings from the registry, if there are any
//
GetSaveSettings(FALSE);
g_ai.hMainDlg = CreateDialog(hInstance, (LPCTSTR) IDD_MAIN,
NULL, (DLGPROC)MainWndProc);
if (!g_ai.hMainDlg)
{
LoadString(hInstance, IDS_NO_MAIN_DLG, wszError, sizeof(wszError));
MessageBox(NULL, wszError, APP_NAME, MB_OK | MB_ICONERROR);
return 0;
}
//
// Get the window position info from the registry, if it's there
//
GetSavePositionInfo(FALSE, &pt);
//
// Get the coords of the desktop window and place the dialog
//
GetWindowRect(GetDesktopWindow(), &rcDesktop);
GetWindowRect(g_ai.hMainDlg, &rcDialog);
double nWidth = rcDialog.right - rcDialog.left;
double nHeight = rcDialog.bottom - rcDialog.top;
//
// If nothing was stored in the registry, use default settings
//
if (pt.x != 0) {
//
// If the flag is set, make the window topmost
//
SetWindowPos(g_ai.hMainDlg,
g_ai.fOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,
pt.x, pt.y, 0, 0,
SWP_NOSIZE | SWP_SHOWWINDOW);
} else {
//
// If the flag is set, make the window topmost
//
SetWindowPos(g_ai.hMainDlg,
g_ai.fOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,
(rcDesktop.right / 1.05) - (nWidth / 1.05),
(rcDesktop.bottom / 1.05) - (nHeight / 1.05),
0, 0,
SWP_NOSIZE | SWP_SHOWWINDOW);
}
//
// If the flag is set, make the window minimized
//
ShowWindow(g_ai.hMainDlg,
g_ai.fMinimize ? SW_MINIMIZE : SW_SHOWNORMAL);
while (GetMessage(&msg, (HWND) NULL, 0, 0)) {
if (!IsDialogMessage(g_ai.hMainDlg, &msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
/*++
Routine Description:
Runs the message loop for the app
Arguments:
hWnd - Handle to the window
uMsg - Windows message
wParam - Additional message info
lParam - Additional message info
Return Value:
TRUE if handled, FALSE otherwise
--*/
LRESULT
CALLBACK
MainWndProc(
IN HWND hWnd,
IN UINT uMsg,
IN WPARAM wParam,
IN LPARAM lParam
)
{
switch (uMsg) {
case WM_INITDIALOG:
{
WCHAR wszError[MAX_PATH];
//
// Get the handle to the listview and do some init stuff
//
g_ai.hWndList = GetDlgItem(hWnd, IDC_LIST);
InitListViewColumn();
//
// Set up our icon, initialize the menu items, and create the thread
//
SendMessage(hWnd,
WM_SETICON,
TRUE,
(LPARAM)LoadIcon(g_ai.hInstance, MAKEINTRESOURCE(IDI_APPICON)));
CheckMenuItem(GetMenu(hWnd),
IDM_ON_TOP,
g_ai.fOnTop ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd),
IDM_START_SMALL,
g_ai.fMinimize ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(GetMenu(hWnd),
IDM_MONITOR,
g_ai.fMonitor ? MF_CHECKED : MF_UNCHECKED);
if (!CreateReceiveThread())
{
LoadString(g_ai.hInstance, IDS_CREATE_FAILED, wszError, MAX_PATH);
MessageBox(hWnd, wszError, APP_NAME, MB_OK | MB_ICONERROR);
g_ai.fMonitor = FALSE;
} else {
SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
}
break;
}
case WM_CLOSE:
{
RECT rc;
GetWindowRect(hWnd, &rc);
GetSavePositionInfo(TRUE, (LPPOINT)&rc);
GetSaveSettings(TRUE);
RemoveFromTray(hWnd);
EndDialog(hWnd, 0);
PostQuitMessage(0);
break;
}
case WM_SIZE:
if (SIZE_MINIMIZED == wParam) {
ShowWindow(hWnd, SW_HIDE);
AddIconToTray(hWnd,
(HICON) LoadImage(g_ai.hInstance,
MAKEINTRESOURCE(IDI_APPICON),
IMAGE_ICON, 16, 16, 0),
APP_NAME);
return TRUE;
}
MoveWindow(g_ai.hWndList, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
break;
case WM_NOTIFYICON:
switch (lParam) {
case WM_RBUTTONUP:
DisplayMenu(hWnd);
break;
case WM_LBUTTONDBLCLK:
RemoveFromTray(hWnd);
ShowWindow(hWnd, SW_SHOWNORMAL);
break;
}
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDM_EXIT:
PostMessage(hWnd, WM_CLOSE, 0, 0);
break;
case IDM_RESTORE:
ShowWindow(hWnd, SW_SHOWNORMAL);
SetWindowPos(hWnd, g_ai.fOnTop ? HWND_TOPMOST : HWND_NOTOPMOST,
0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);
RemoveFromTray(hWnd);
break;
case IDM_ABOUT:
ShellAbout(hWnd, APP_NAME, WRITTEN_BY, LoadIcon(g_ai.hInstance, MAKEINTRESOURCE(IDI_APPICON)));
break;
case IDM_MONITOR:
CheckMenuItem(GetMenu(hWnd),
IDM_MONITOR,
g_ai.fMonitor ? MF_UNCHECKED : MF_CHECKED);
g_ai.fMonitor = g_ai.fMonitor ? FALSE : TRUE;
if (g_ai.fMonitor) {
CreateReceiveThread();
}
break;
case IDM_ON_TOP:
CheckMenuItem(GetMenu(hWnd),
IDM_ON_TOP,
g_ai.fOnTop ? MF_UNCHECKED : MF_CHECKED);
SetWindowPos(hWnd, g_ai.fOnTop ? HWND_NOTOPMOST : HWND_TOPMOST,
0,0,0,0, SWP_NOSIZE | SWP_NOMOVE);
g_ai.fOnTop = g_ai.fOnTop ? FALSE : TRUE;
break;
case IDM_START_SMALL:
CheckMenuItem(GetMenu(hWnd),
IDM_START_SMALL,
g_ai.fMinimize ? MF_UNCHECKED : MF_CHECKED);
g_ai.fMinimize = g_ai.fMinimize ? FALSE : TRUE;
break;
case IDM_CLEAR:
ListView_DeleteAllItems(g_ai.hWndList);
break;
default:
break;
}
}
return FALSE;
}