windows-nt/Source/XPSP1/NT/drivers/wdm/input/tools/hidmon/hidmon.c
2020-09-26 16:20:57 +08:00

399 lines
11 KiB
C

/***************************************************************************************************
**
** MODULE:
**
**
** DESCRIPTION:
**
**
** AUTHOR: Daniel Dean.
**
**
**
** CREATED:
**
**
**
**
** (C) C O P Y R I G H T D A N I E L D E A N 1 9 9 6.
***************************************************************************************************/
#include <WINDOWS.H>
#include <dbt.h> // for device change notification defines
#include <hidsdi.h>
#include "CLASS.H"
#include "IOCTL.H"
HANDLE hInst; // Program instance handle
HWND hWndFrame = NULL; // Handle to main window
HWND hWndMDIClient = NULL; // Handle to MDI client
LONG styleDefault = 0; // Default style bits for child windows
/***************************************************************************************************
**
** HIDFrameWndProc.
**
** DESCRIPTION: If cases are added for WM_MENUCHAR, WM_NEXTMENU, WM_SETFOCUS,
** and WM_SIZE, note that these messages should be passed on
** to DefFrameProc even if we handle them. See the SDK Reference
** entry for DefFrameProc
**
** PARAMETERS:
**
** RETURNS:
**
***************************************************************************************************/
LPARAM WINAPI HIDFrameWndProc(HWND hWnd, UINT Message, UINT uParam, LPARAM lParam)
{
switch(Message)
{
case WM_CREATE:
{
CLIENTCREATESTRUCT ccs;
// Find window menu where children will be listed
ccs.hWindowMenu = GetSubMenu (GetMenu(hWnd),WINDOWMENU);
ccs.idFirstChild = IDM_WINDOWCHILD;
// Create the MDI client
hWndMDIClient = CreateWindow("mdiclient",
NULL,
WS_CHILD | WS_CLIPCHILDREN,
0,
0,
0,
0,
hWnd,
0,
hInst,
(LPSTR)&ccs);
ShowWindow(hWndMDIClient,SW_SHOW);
break;
}
case WM_DEVICECHANGE:
switch( uParam )
{
//
// On removal or insertion of a device, reenumerate the
// attached USB devices
case DBT_DEVICEARRIVAL:
case DBT_DEVICEREMOVECOMPLETE:
CloseAllChildren();
//Sleep(1000);
OpenClassObjects();
return TRUE;
}
break;
case WM_COMMAND:
// Direct all menu selection or accelerator commands to
// the CommandHandler function
CommandHandler(hWnd,uParam);
break;
case WM_CLOSE:
{
DestroyWindow(hWnd);
PostQuitMessage(0);
break;
}
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
// use DefFrameProc() instead of DefWindowProc(), since there
// are things that have to be handled differently because of MDI
return DefFrameProc (hWnd,hWndMDIClient,Message,uParam,lParam);
}
return 0;
}
/***************************************************************************************************
**
** CloseChildWindow.
**
** DESCRIPTION:
**
** PARAMETERS:
**
** RETURNS: VOID.
**
***************************************************************************************************/
VOID CloseChildWindow(HWND hWnd)
{
HANDLE hDevice;
OutputDebugString(">>>>HIDMON.EXE: CloseChildWindow()Enter\n");
IOCTLStop(hWnd);
OutputDebugString(">>>>HIDMON.EXE: CloseChildWindow(): CloseHandle()\n");
hDevice=GetDeviceHandle(hWnd);
CloseHandle(hDevice);
SetDeviceHandle(hWnd,NULL);
OutputDebugString(">>>>HIDMON.EXE: CloseChildWindow()Exit\n");
}
/***************************************************************************************************
**
** HIDMDIChildWndProc.
**
** DESCRIPTION: If cases are added for WM_CHILDACTIVATE, WM_GETMINMAXINFO,
** WM_MENUCHAR, WM_MOVE, WM_NEXTMENU, WM_SETFOCUS, WM_SIZE,
** or WM_SYSCOMMAND, these messages should be passed on
** to DefMDIChildProc even if we handle them. See the SDK
** Reference entry for DefMDIChildProc.
**
** PARAMETERS:
**
** RETURNS:
**
***************************************************************************************************/
#define IDT_READTIMER 1000
LPARAM WINAPI HIDMDIChildWndProc(HWND hWnd, UINT Message, UINT uParam, LPARAM lParam)
{
PCHILD_INFO pChildInfo;
switch(Message)
{
case WM_CREATE:
{
HWND hEdit;
HFONT hfFixed;
hEdit = CreateWindow("EDIT", 0, EDIT_WRAP, 0, 0, 0, 0, hWnd, NULL, GetModuleHandle(NULL), NULL);
if(!hEdit)
{
MessageBox(hWnd,"ChildWindowProc(): CreateWindow(EDIT) fialed","Ooops!",MB_OK);
return -1;
}
hfFixed = GetStockObject(DEFAULT_GUI_FONT );//ANSI_FIXED_FONT);
SendMessage(hEdit,WM_SETFONT,(WPARAM)hfFixed,0L);
SetEditWin(hWnd, hEdit);
// TESTING!!!!!
SetTimer(hWnd,IDT_TIMER,5,(TIMERPROC)ReadWatch);
return 0;
}
case WM_COMMAND:
switch(uParam)
{
case IDM_CHANNEL: return IOCTLChannelDesc(hWnd);
case IDM_DEVICE: return IOCTLDeviceDesc(hWnd);
case IDM_READ: return IOCTLRead(hWnd);
case IDM_WRITE: return IOCTLWrite(hWnd);
case IDM_STOP: return IOCTLStop(hWnd);
default: return SUCCESS;
}
case WM_SIZE:
return !MoveWindow(GetEditWin(hWnd), 0, 0, (INT) LOWORD(lParam), (INT) HIWORD(lParam), TRUE);
case WM_RBUTTONUP:
SetFocus(hWnd);
return PopUpMenu(hInst, hWnd, hWnd, lParam, "CHILD_MENU");
case WM_MDIDESTROY:
case WM_DESTROY:
OutputDebugString(">>>>HIDMON.EXE: ChildWndProc WM_DESTROY\n");
//TESTING!!
KillTimer(hWnd,IDT_TIMER);
CloseChildWindow(hWnd);
// Free all the stuff malloc'd for this window
pChildInfo = (PCHILD_INFO) GetDeviceInfo(hWnd);
free( pChildInfo->hidPPData);
GlobalFree( pChildInfo->hidCaps);
GlobalFree( pChildInfo->pValueCaps);
GlobalFree( pChildInfo->pButtonCaps);
GlobalFree( pChildInfo );
return 0;
default:
return DefMDIChildProc (hWnd, Message, uParam, lParam);
}
return SUCCESS;
}
/***************************************************************************************************
**
** CommandHandler.
**
** DESCRIPTION:
**
** PARAMETERS:
**
** RETURNS:
**
***************************************************************************************************/
VOID CommandHandler(HWND hWnd, UINT uParam)
{
switch(uParam)
{
case IDM_FILEEXIT:
// Close application
SendMessage(hWnd, WM_CLOSE, 0, 0L);
break;
case IDM_FILEREENUM:
CloseAllChildren();
OpenClassObjects();
break;
case IDM_WINDOWTILE:
// Tile MDI windows
SendMessage(hWndMDIClient, WM_MDITILE, 0, 0L);
break;
case IDM_WINDOWCASCADE:
// Cascade MDI windows
SendMessage(hWndMDIClient, WM_MDICASCADE, 0, 0L);
break;
case IDM_WINDOWICONS:
// Auto - arrange MDI icons
SendMessage(hWndMDIClient, WM_MDIICONARRANGE, 0, 0L);
break;
case IDM_WINDOWCLOSEALL:
CloseAllChildren();
break;
case IDM_DEVICECHANGE:
SendMessage(hWnd,WM_DEVICECHANGE,DBT_DEVICEREMOVECOMPLETE,0);
break;
default:
DefFrameProc(hWnd, hWndMDIClient, WM_COMMAND, uParam, 0L);
}
}
/***************************************************************************************************
**
** CloseAllChildern.
**
** DESCRIPTION: Destroys all MDI child windows.
**
** PARAMETERS:
**
** RETURNS:
**
***************************************************************************************************/
VOID CloseAllChildren (VOID)
{
HWND hWnd;
// As long as the MDI client has a child, destroy it
while(hWnd = GetWindow (hWndMDIClient, GW_CHILD))
{
// Skip the icon title windows
while(hWnd && GetWindow (hWnd, GW_OWNER))
hWnd = GetWindow (hWnd, GW_HWNDNEXT);
if(hWnd)
SendMessage(hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWnd, 0L);
else
break;
}
}
/*****************************************************************************
**
**
**
**
**
**
**
**
**
*****************************************************************************/
LRESULT PopUpMenu(HANDLE hInst, HWND hWnd, HWND hMWnd, LPARAM lPoint, LPSTR lpMenu)
{
POINT point;
HMENU hMenu;
HMENU hMenuTP;
hMenu = LoadMenu(hInst, lpMenu);
if(!hMenu) return FAILURE;
point.x = LOWORD(lPoint);
point.y = HIWORD(lPoint);
hMenuTP = GetSubMenu(hMenu, 0);
ClientToScreen(hWnd, (LPPOINT)&point);
TrackPopupMenu(hMenuTP, 0, point.x, point.y, 0, hMWnd, NULL);
DestroyMenu(hMenu);
return SUCCESS;
}
/***************************************************************************************************
**
** WinMain.
**
** DESCRIPTION:
**
** PARAMETERS:
**
** RETURNS:
**
***************************************************************************************************/
INT PASCAL WinMain(HANDLE hInstance,
HANDLE hPrevInstance,
LPSTR szCommand,
INT WindowState)
{
MSG Message;
hInst = hInstance;
// If this is the first instance of the app. register window classes
if(!hPrevInstance)
if(!InitializeApplication())
return 0;
// Create the frame and do other initialization
if(!InitializeInstance(szCommand, WindowState))
return 0;
// Enter main message loop
while(GetMessage(&Message, NULL, 0, 0))
// If a keyboard message is for the MDI, let the MDI client
// take care of it. Otherwise, just handle the message as usual
if(!TranslateMDISysAccel(hWndMDIClient, &Message))
{
// Edit windows should get no mouse messages
if(Message.message >= WM_MOUSEFIRST && Message.message <= WM_MOUSELAST)
{
if(Message.message == WM_RBUTTONUP)
Message.hwnd = GetParent(Message.hwnd);
else
continue;
}
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.lParam;
}