399 lines
11 KiB
C
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;
|
|
}
|