mirror of https://github.com/lianthony/NT4.0
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.
528 lines
11 KiB
528 lines
11 KiB
/*--------------------------------------------------------------
|
|
*
|
|
* FILE: SK_EX.C
|
|
*
|
|
* PURPOSE: This File contains the interface routines
|
|
* that connect Serial Keys to the Mouse or keyboard.
|
|
*
|
|
* CREATION: June 1994
|
|
*
|
|
* COPYRIGHT: Black Diamond Software (C) 1994
|
|
*
|
|
* AUTHOR: Ronald Moak
|
|
*
|
|
* NOTES:
|
|
*
|
|
* This file, and all others associated with it contains trade secrets
|
|
* and information that is proprietary to Black Diamond Software.
|
|
* It may not be copied copied or distributed to any person or firm
|
|
* without the express written permission of Black Diamond Software.
|
|
* This permission is available only in the form of a Software Source
|
|
* License Agreement.
|
|
*
|
|
* $Header: %Z% %F% %H% %T% %I%
|
|
*
|
|
*--- Includes ---------------------------------------------------------*/
|
|
|
|
#include <windows.h>
|
|
//#include <winsecp.h>
|
|
|
|
#include "debug.h"
|
|
#include "vars.h"
|
|
#include "sk_defs.h"
|
|
#include "sk_comm.h"
|
|
#include "sk_ex.H"
|
|
|
|
#ifdef QUEUE_BUF
|
|
typedef struct _KEYQUE
|
|
{
|
|
BYTE VirKey;
|
|
BYTE ScanCode;
|
|
int Flags;
|
|
} KEYQUE;
|
|
|
|
#define MAXKEYS 100
|
|
|
|
KEYQUE KeyQue[MAXKEYS];
|
|
int KeyFront = 0; // Pointer to front of Que
|
|
int KeyBack = 0; // Pointer to Back of Que
|
|
#endif
|
|
|
|
|
|
#define CTRL 56
|
|
#define ALT 29
|
|
#define DEL 83
|
|
|
|
char Key[3];
|
|
int Push = 0;
|
|
|
|
POINT MouseAnchor;
|
|
HWND MouseWnd;
|
|
|
|
static HDESK s_hdeskSave = NULL;
|
|
static HDESK s_hdeskUser = NULL;
|
|
|
|
|
|
// Local Function Prototypes -------------------------------------
|
|
|
|
static void SendAltCtrlDel();
|
|
static void CheckAltCtrlDel(int scanCode);
|
|
static void AddKey(BYTE VirKey, BYTE ScanCode, int Flags);
|
|
|
|
|
|
/*---------------------------------------------------------------
|
|
* Public Functions
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SkEx_SetAnchor()
|
|
*
|
|
* TYPE Global
|
|
*
|
|
* PURPOSE Sets an anchor to the current mouse position within
|
|
* the current window.
|
|
*
|
|
* INPUTS int scanCode
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
void SkEx_SetAnchor()
|
|
{
|
|
GetCursorPos(&MouseAnchor);
|
|
|
|
#ifdef DEBUG
|
|
{
|
|
char buf[70];
|
|
wsprintfA(buf, "SkEx_SetAnchor( x %d y %d )", MouseAnchor.x, MouseAnchor.y);
|
|
DBG_OUT(buf);
|
|
}
|
|
#endif
|
|
|
|
// MouseWnd = GetActiveWindow();
|
|
// ScreenToClient(MouseWnd, &MouseAnchor);
|
|
}
|
|
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SkEx_GetAnchor()
|
|
*
|
|
* TYPE Global
|
|
*
|
|
* PURPOSE Returns the mouse postion within the active window
|
|
*
|
|
* INPUTS int scanCode
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
BOOL SkEx_GetAnchor(LPPOINT Mouse)
|
|
{
|
|
#if 0
|
|
HWND CurrentWnd;
|
|
|
|
CurrentWnd = GetActiveWindow();
|
|
|
|
if (CurrentWnd != MouseWnd) // Has the Active window Changed?
|
|
return(FALSE); // Yes Return False
|
|
|
|
ClientToScreen(MouseWnd, &MouseAnchor); // Convert Window to Screen
|
|
|
|
#endif
|
|
|
|
Mouse->x = MouseAnchor.x;
|
|
Mouse->y = MouseAnchor.y;
|
|
|
|
#ifdef DEBUG
|
|
{
|
|
char buf[70];
|
|
wsprintfA(buf, "SkEx_GetAnchor( x %d y %d )", MouseAnchor.x, MouseAnchor.y);
|
|
DBG_OUT(buf);
|
|
}
|
|
#endif
|
|
|
|
return(TRUE);
|
|
}
|
|
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SkEx_SendBeep()
|
|
*
|
|
* TYPE Global
|
|
*
|
|
* PURPOSE Send Keyboard Down events to the Event Manager
|
|
*
|
|
* INPUTS int scanCode
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
void SkEx_SendBeep()
|
|
{
|
|
MessageBeep(0);
|
|
}
|
|
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SkEx_SetBaud(int Baud)
|
|
*
|
|
* TYPE Global
|
|
*
|
|
* PURPOSE Sets the Baudrate for the current port
|
|
*
|
|
* INPUTS int scanCode
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
void SkEx_SetBaud(int Baud)
|
|
{
|
|
DBG_OUT("SkEx_SetBaud()");
|
|
|
|
SetCommBaud(Baud);
|
|
}
|
|
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SkEx_SendKeyDown()
|
|
*
|
|
* TYPE Global
|
|
*
|
|
* PURPOSE Send Keyboard Down events to the Event Manager
|
|
*
|
|
* INPUTS int scanCode
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
void SkEx_SendKeyDown(int scanCode)
|
|
{
|
|
BYTE c;
|
|
int Flags = 0;
|
|
|
|
if (scanCode & 0xE000) // Is this and Extended Key
|
|
{
|
|
Flags = KEYEVENTF_EXTENDEDKEY; // Yes - Set Ext Flag
|
|
scanCode &= 0x000000FF; // Clear out extended value
|
|
}
|
|
c = (BYTE)MapVirtualKey(scanCode, 3);
|
|
|
|
if (scanCode == ALT || scanCode == CTRL || scanCode == DEL)
|
|
CheckAltCtrlDel(scanCode);
|
|
|
|
#ifdef DEBUG
|
|
{
|
|
char buf[60];
|
|
wsprintfA(buf, "SkEx_SendKeyDown(Virtual %d Scan %d Flag %d)", c, scanCode, Flags);
|
|
DBG_OUT(buf);
|
|
}
|
|
#endif
|
|
DeskSwitchToInput();
|
|
keybd_event(c, (BYTE) scanCode, Flags, 0L);
|
|
}
|
|
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SkEx_SendKeyDown()
|
|
*
|
|
* TYPE Global
|
|
*
|
|
* PURPOSE Send Keyboard Up events to the Event Manager
|
|
*
|
|
* INPUTS int scanCode
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
void SkEx_SendKeyUp(int scanCode)
|
|
{
|
|
BYTE c;
|
|
int Flags = 0;
|
|
|
|
if (Push)
|
|
{
|
|
Key[0] = Key[1] = Key[2] = 0; // Clear Buffer
|
|
Push = 0; // Reset AltCtrlDel
|
|
}
|
|
|
|
if (scanCode & 0xE000) // Is this and Extended Key
|
|
{
|
|
Flags = KEYEVENTF_EXTENDEDKEY; // Yes - Set Ext Flag
|
|
scanCode &= 0xFF; // Clear out extended value
|
|
}
|
|
|
|
Flags += KEYEVENTF_KEYUP;
|
|
c = (BYTE) MapVirtualKey(scanCode, 3);
|
|
|
|
#ifdef DEBUG
|
|
{
|
|
char buf[60];
|
|
wsprintfA(buf, "SkEx_SendKeyUp(Virtual %d Scan %d Flags %d)", c, scanCode, Flags);
|
|
DBG_OUT(buf);
|
|
}
|
|
#endif
|
|
DeskSwitchToInput();
|
|
keybd_event(c, (BYTE) scanCode, Flags, 0L);
|
|
}
|
|
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SkEx_SendMouse()
|
|
*
|
|
* TYPE Global
|
|
*
|
|
* PURPOSE Send Mouse Events to the Event manager
|
|
*
|
|
* INPUTS int scanCode
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
void SkEx_SendMouse(MOUSEKEYSPARAM *p)
|
|
{
|
|
|
|
#ifdef DEBUG
|
|
{
|
|
char buf[70];
|
|
wsprintfA(buf, "SkEx_SendMouse(Stat %d x %d y %d )", p->Status, p->Delta_X, p->Delta_Y);
|
|
DBG_OUT(buf);
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// This code converts screen positions relative to logical Mouse Positions
|
|
// The Mouse range is from 0, 0 to 65536, 65536
|
|
#if 0
|
|
|
|
int Wide, High;
|
|
|
|
if (p->Status & MOUSEEVENTF_ABSOLUTE) // Is this Absolute Cordinates
|
|
{
|
|
Wide = GetSystemMetrics(SM_CXSCREEN); // Yes - Convert to Screen
|
|
High = GetSystemMetrics(SM_CYSCREEN);
|
|
|
|
p->Delta_X = (p->Delta_X * 65536) / Wide;
|
|
p->Delta_Y = (p->Delta_Y * 65536) / High;
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
wsprintf(buf, "Screen Wide %d High %d", Wide, High);
|
|
DBG_OUT(buf);
|
|
#endif
|
|
#endif
|
|
|
|
p->Delta_X /= 2;
|
|
p->Delta_Y /= 2;
|
|
|
|
DeskSwitchToInput();
|
|
|
|
mouse_event
|
|
(
|
|
(DWORD) p->Status, // Flags specifing motion / click variants
|
|
(DWORD) p->Delta_X, // Horizontal Position or change
|
|
(DWORD) p->Delta_Y, // Vertical Position or change
|
|
0, // Reserved
|
|
GetMessageExtraInfo() // 32 bit Extra Value
|
|
);
|
|
}
|
|
|
|
#ifdef QUEUE_BUF
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SendKey()
|
|
*
|
|
* TYPE Global
|
|
*
|
|
* PURPOSE This Function Send keys from the Que to Windows NT
|
|
*
|
|
* INPUTS None
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
void SendKey()
|
|
{
|
|
if (KeyBack == KeyFront) // Are there Keys in the Que?
|
|
return; // No - Exit;
|
|
|
|
#ifdef DEBUG
|
|
{
|
|
char buf[70];
|
|
wsprintf(buf, "SkEx_SendKey(KeyBack %d )", KeyBack);
|
|
DBG_OUT(buf);
|
|
}
|
|
#endif
|
|
DeskSwitchToInput();
|
|
keybd_event // Process the Key Event
|
|
(
|
|
KeyQue[KeyBack].VirKey,
|
|
KeyQue[KeyBack].ScanCode,
|
|
KeyQue[KeyBack].Flags, 0L
|
|
);
|
|
|
|
KeyBack++; // Increment Key pointer
|
|
if (KeyBack == MAXKEYS) // Are we at the End of the buffer
|
|
KeyBack = 0; // Yes - Reset to start.
|
|
}
|
|
|
|
/*---------------------------------------------------------------
|
|
* Local Functions
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION AddKey(BYTE VirKey, BYTE ScanCode, int Flags)
|
|
*
|
|
* TYPE Local
|
|
*
|
|
* PURPOSE Adds a key to the Key Que.
|
|
*
|
|
* INPUTS BYTE VirKey - Virtual Key
|
|
* BYTE ScanCode-
|
|
* int Flags -
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
static void AddKey(BYTE VirKey, BYTE ScanCode, int Flags)
|
|
{
|
|
|
|
#ifdef DEBUG
|
|
{
|
|
char buf[70];
|
|
wsprintf(buf, "AddKey(KeyFront %d )", KeyFront);
|
|
DBG_OUT(buf);
|
|
}
|
|
#endif
|
|
|
|
// Add Keys to Que
|
|
KeyQue[KeyFront].VirKey = VirKey;
|
|
KeyQue[KeyFront].ScanCode = ScanCode;
|
|
KeyQue[KeyFront].Flags = Flags;
|
|
|
|
KeyFront++; // Point to next Que
|
|
if (KeyFront == MAXKEYS) // Are we at the End of the buffer
|
|
KeyFront = 0; // Yes - Reset to start.
|
|
|
|
// Process the Key Event
|
|
DeskSwitchToInput();
|
|
keybd_event(VirKey, ScanCode, Flags, 0L);
|
|
|
|
}
|
|
#endif // QUE
|
|
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION CheckAltCtrlDel(int scanCode)
|
|
*
|
|
* TYPE Local
|
|
*
|
|
* PURPOSE Checks for the condition of Alt-Ctrl-Del key
|
|
* Combination.
|
|
*
|
|
* INPUTS int scanCode
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
static void CheckAltCtrlDel(int scanCode)
|
|
{
|
|
int val;
|
|
|
|
DBG_OUT("CheckAltCtrlDel()");
|
|
Key[Push] = scanCode; // Save Scan Code
|
|
Push++; // Inc Index
|
|
|
|
if (Push != 3) // Have we got 3 keys?
|
|
return; // No - Exit
|
|
|
|
val = Key[0] + Key[1] + Key[2]; // Sum up the Keys
|
|
|
|
if (val = (ALT+CTRL+DEL)) // Is Buffer Alt=Ctrl=Del
|
|
SendAltCtrlDel(); // Yes - Send command
|
|
}
|
|
|
|
/*---------------------------------------------------------------
|
|
*
|
|
* FUNCTION SendAltCtrlDel()
|
|
*
|
|
* TYPE Local
|
|
*
|
|
* PURPOSE Signal system reset
|
|
*
|
|
* INPUTS None
|
|
*
|
|
* RETURNS None
|
|
*
|
|
*---------------------------------------------------------------*/
|
|
static void SendAltCtrlDel()
|
|
{
|
|
HWINSTA hwinsta;
|
|
HDESK hdesk;
|
|
HWND hwndSAS;
|
|
HWINSTA hwinstaSave;
|
|
HDESK hdeskSave;
|
|
|
|
DBG_OUT("SendAltCtrlDel()");
|
|
|
|
hwinstaSave = GetProcessWindowStation();
|
|
hdeskSave = GetThreadDesktop(GetCurrentThreadId());
|
|
|
|
hwinsta = OpenWindowStation(TEXT("WinSta0"), FALSE, MAXIMUM_ALLOWED);
|
|
SetProcessWindowStation(hwinsta);
|
|
hdesk = OpenDesktop(TEXT("Winlogon"), 0, FALSE, MAXIMUM_ALLOWED);
|
|
SetThreadDesktop(hdesk);
|
|
|
|
hwndSAS = FindWindow(NULL, TEXT("SAS window"));
|
|
////PostMessage(hwndSAS, WM_HOTKEY, 0, 0);
|
|
SendMessage(hwndSAS, WM_HOTKEY, 0, 0);
|
|
|
|
if (NULL != hdeskSave)
|
|
{
|
|
SetThreadDesktop(hdeskSave);
|
|
}
|
|
|
|
if (NULL != hwinstaSave)
|
|
{
|
|
SetProcessWindowStation(hwinstaSave);
|
|
}
|
|
|
|
CloseDesktop(hdesk);
|
|
CloseWindowStation(hwinsta);
|
|
}
|
|
|
|
BOOL DeskSwitchToInput()
|
|
{
|
|
BOOL fOk = FALSE;
|
|
HANDLE hNewDesktop;
|
|
|
|
// We are switching desktops
|
|
|
|
DBG_OUT("DoDeskSwitch()");
|
|
|
|
// get current Input desktop
|
|
hNewDesktop = OpenInputDesktop(
|
|
0L,
|
|
FALSE,
|
|
MAXIMUM_ALLOWED);
|
|
|
|
if (NULL == hNewDesktop)
|
|
{
|
|
DBG_OUT("OpenInputDesktop failed");
|
|
}
|
|
else
|
|
{
|
|
fOk = SetThreadDesktop(hNewDesktop); // attach thread to desktop
|
|
if (!fOk)
|
|
{
|
|
DBG_ERR("Failed SetThreadDesktop()");
|
|
}
|
|
else
|
|
{
|
|
if (NULL != s_hdeskUser)
|
|
{
|
|
CloseDesktop(s_hdeskUser); // close old desktop
|
|
}
|
|
s_hdeskUser = hNewDesktop; // save desktop
|
|
}
|
|
}
|
|
return(fOk);
|
|
}
|
|
|