Csdn不好传文件,所以把代码传上来
.h
#ifndef __SYS_TOUCH_H__
#define __SYS_TOUCH_H__
#ifdef __cplusplus
extern "C" {
#endif
typedef UINT32 TOUCH_PANEL_SAMPLE_FLAGS, *P_TOUCH_PANEL_SAMPLE_FLAGS;
enum enumTouchPanelSampleFlags
{
TouchSampleValidFlag = 0x01, //@EMEM The sample is valid.
TouchSampleDownFlag = 0x02, //@EMEM The finger/stylus is down.
TouchSampleIsCalibratedFlag = 0x04, //@EMEM The XY data has already been calibrated.
TouchSamplePreviousDownFlag = 0x08, //@EMEM The state of the previous valid sample.
TouchSampleIgnore = 0x10, //@EMEM Ignore this sample.
TouchSampleMouse = 0x40000000 // reserved
};
#define TouchSampleDown(Flags) (Flags&TouchSampleDownFlag)
#define TouchSamplePreviousDown(Flags) (Flags&TouchSamplePreviousDownFlag)
#define TouchSampleIsMouse(Flags) (Flags&TouchSampleMouse)
//
// TouchPanelGetDeviceCaps query capability definitions
//
// @const ULONG | TPDC_SAMPLERATE_ID |
// Sampling rate device capability.
//
#define TPDC_SAMPLE_RATE_ID 0
struct TPDC_SAMPLE_RATE
{
INT SamplesPerSecondLow;
INT SamplesPerSecondHigh;
INT CurrentSampleRateSetting; // 0 => Low, 1 => High
};
//
// @type DDI_TOUCH_PANEL_CALIBRATION_FLAGS |
// Calibration flags
//
// @comm
// The definition is:<nl>
// <tab>typedef UINT32 DDI_TOUCH_PANEL_CALIBRATION_FLAGS;
typedef UINT32 DDI_TOUCH_PANEL_CALIBRATION_FLAGS;
//
// @const ULONG | TPDC_CALIBRATION_POINT_COUNT_ID |
// Calibration points device capability
//
#define TPDC_CALIBRATION_POINT_COUNT_ID 1
struct TPDC_CALIBRATION_POINT_COUNT
{
DDI_TOUCH_PANEL_CALIBRATION_FLAGS flags;
INT cCalibrationPoints;
};
//
// @const ULONG | TPDC_CALIBRATION_POINT_ID |
// Calibration mapping data device capability
//
#define TPDC_CALIBRATION_POINT_ID 2
struct TPDC_CALIBRATION_POINT
{
INT PointNumber;
INT cDisplayWidth;
INT cDisplayHeight;
INT CalibrationX;
INT CalibrationY;
};
//
// TouchPanelSetMode set capability defintions
//
// @const ULONG | TPSM_SAMPLERATE_HIGH_ID |
// Device mode for the high sampling rate for points.
//
// @const ULONG | TPSM_SAMPLERATE_LOW_ID |
// Device mode for the low sampling rate for points.
//
//
#define TPSM_SAMPLERATE_HIGH_ID 0x00
#define TPSM_SAMPLERATE_LOW_ID 0x01
#define TPSM_PRIORITY_HIGH_ID 0x02
#define TPSM_PRIORITY_NORMAL_ID 0x04
// Function Definitions
BOOL
TouchPanelGetDeviceCaps(
INT iIndex,
LPVOID lpOutput
);
typedef BOOL (*PFN_TOUCH_PANEL_GET_DEVICE_CAPS)(
INT iIndex,
LPVOID lpOutput
);
BOOL
TouchPanelSetMode(
INT iIndex,
LPVOID lpInput
);
typedef BOOL (*PFN_TOUCH_PANEL_SET_MODE)(
INT iIndex,
LPVOID lpInput
);
typedef BOOL (*PFN_TOUCH_PANEL_CALLBACK)(
TOUCH_PANEL_SAMPLE_FLAGS Flags,
INT X,
INT Y
);
typedef VOID (*PFN_DISP_DRIVER_MOVE_CURSOR)(
INT32 X,
INT32 Y
);
BOOL
TouchPanelInitializeCursor(
PFN_DISP_DRIVER_MOVE_CURSOR
);
typedef BOOL (*PFN_TOUCH_PANEL_INITIALIZE_CURSOR)(
PFN_DISP_DRIVER_MOVE_CURSOR
);
BOOL
TouchPanelEnable(
PFN_TOUCH_PANEL_CALLBACK
);
typedef BOOL (*PFN_TOUCH_PANEL_ENABLE)(PFN_TOUCH_PANEL_CALLBACK);
VOID
TouchPanelDisable(
VOID
);
typedef VOID (*PFN_TOUCH_PANEL_DISABLE)(VOID);
BOOL
TouchPanelReadCalibrationPoint(
INT *pUncalibratedX,
INT *pUncalibratedY
);
typedef BOOL (*PFN_TOUCH_PANEL_READ_CALIBRATION_POINT)(
INT *pUncalibratedX,
INT *pUncalibratedY
);
VOID
TouchPanelReadCalibrationAbort(
VOID
);
typedef VOID (*PFN_TOUCH_PANEL_READ_CALIBRATION_ABORT)(
VOID
);
BOOL
TouchPanelSetCalibration(
INT32 cCalibrationPoints, //The number of calibration points
INT32 *pScreenXBuffer, //List of screen X coords displayed
INT32 *pScreenYBuffer, //List of screen Y coords displayed
INT32 *pUncalXBuffer, //List of X coords collected
INT32 *pUncalYBuffer //List of Y coords collected
);
typedef BOOL (*PFN_TOUCH_PANEL_SET_CALIBRATION)(
INT32 cCalibrationPoints,
INT32 *pScreenXBuffer,
INT32 *pScreenYBuffer,
INT32 *pUncalXBuffer,
INT32 *pUncalYBuffer
);
void
TouchPanelCalibrateAPoint(
INT32 UncalX,
INT32 UncalY,
INT32 *pCalX,
INT32 *pCalY
);
typedef void (*PFN_TOUCH_PANEL_CALIBRATE_A_POINT)(
INT32 UncalX,
INT32 UncalY,
INT32 *pCalX,
INT32 *pCalY
);
void
TouchPanelPowerHandler(
BOOL bOff
);
typedef void (*PFN_TOUCH_PANEL_POWER_HANDLER)(
BOOL bOff
);
#ifdef __cplusplus
}
#endif
#endif
.cpp
// GUTouch.cpp : Defines the entry point for the DLL application.
//
#include <windows.h>
#include <commctrl.h>
#include "sysTouch.h"
#define TOUCH_DLL L"//Windows//Touch.dll"
HINSTANCE g_hInstTouch = NULL;
PFN_TOUCH_PANEL_GET_DEVICE_CAPS pfnTouchPanelGetDeviceCaps = NULL;
PFN_TOUCH_PANEL_SET_MODE pfnTouchPanelSetMode = NULL;
PFN_TOUCH_PANEL_INITIALIZE_CURSOR pfnTouchPanelInitializeCursor = NULL;
PFN_TOUCH_PANEL_ENABLE pfnTouchPanelEnable = NULL;
PFN_TOUCH_PANEL_DISABLE pfnTouchPanelDisable = NULL;
PFN_TOUCH_PANEL_READ_CALIBRATION_POINT pfnTouchPanelReadCalibrationPoint = NULL;
PFN_TOUCH_PANEL_READ_CALIBRATION_ABORT pfnTouchPanelReadCalibrationAbort = NULL;
PFN_TOUCH_PANEL_SET_CALIBRATION pfnTouchPanelSetCalibration = NULL;
PFN_TOUCH_PANEL_CALIBRATE_A_POINT pfnTouchPanelCalibrateAPoint = NULL;
PFN_TOUCH_PANEL_POWER_HANDLER pfnTouchPanelPowerHandler = NULL;
PFN_TOUCH_PANEL_CALLBACK pfnOrgTouchPanelCallback = NULL;
HWND g_sipWnd = NULL;
HWND g_hwWnd = NULL;
#define HW_CLASSNAME L"CeSipEng"
INT xSaved = 0;
INT ySaved = 0;
int iMinX = 4;
int iMinY = 4;
BOOL hwTouchPanelCallback(
TOUCH_PANEL_SAMPLE_FLAGS Flags,
INT X,
INT Y
)
{
if(NULL == g_sipWnd)
{
g_sipWnd = FindWindow(L"SipWndClass", NULL);
}
g_hwWnd = GetWindow(g_sipWnd, GW_CHILD);
if(IsWindowVisible(g_hwWnd))
{
TCHAR szClassName[32];
GetClassName(g_hwWnd, szClassName, 32);
if(wcsicmp(szClassName, HW_CLASSNAME) == 0)
{
// down
if(Flags == (TouchSampleDownFlag | TouchSampleIsCalibratedFlag | TouchSampleValidFlag))
{
SendMessage(g_hwWnd, WM_LBUTTONDOWN, 0, MAKELPARAM(X,Y));
}
// mouse
else if(Flags == (TouchSampleDownFlag | TouchSamplePreviousDownFlag | TouchSampleIsCalibratedFlag |
TouchSampleValidFlag) &&
xSaved - X > iMinX || X - xSaved > iMinX &&
ySaved - Y > iMinY || Y - ySaved > iMinY)
{
SendMessage(g_hwWnd, WM_MOUSEMOVE, 0, MAKELPARAM(X,Y));
}
// up
else if(Flags ==(TouchSampleIsCalibratedFlag |
TouchSampleValidFlag | TouchSamplePreviousDownFlag))
{
SendMessage(g_hwWnd, WM_LBUTTONUP, 0, MAKELPARAM(X,Y));
}
xSaved = X;
ySaved = Y;
return TRUE;
}
else
return pfnOrgTouchPanelCallback(Flags, X,Y);
}
return pfnOrgTouchPanelCallback(Flags, X,Y);
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch ( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls((HMODULE) hModule);
g_hInstTouch = LoadLibrary(TOUCH_DLL);
break;
case DLL_PROCESS_DETACH:
if(NULL != g_hInstTouch)
FreeLibrary(g_hInstTouch);
break;
}
return TRUE;
}
VOID TouchPanelCalibrateAPoint(
INT32 UncalX,
INT32 UncalY,
INT32* pCalX,
INT32* pCalY
)
{
if(g_hInstTouch)
{
if (NULL == pfnTouchPanelGetDeviceCaps)
{
pfnTouchPanelCalibrateAPoint = (PFN_TOUCH_PANEL_CALIBRATE_A_POINT)GetProcAddress(g_hInstTouch,
TEXT("TouchPanelCalibrateAPoint"));
}
pfnTouchPanelCalibrateAPoint(UncalX, UncalY, pCalX, pCalY);
}
}
VOID
TouchPanelDisable(
VOID
)
{
if(g_hInstTouch)
{
if (NULL == pfnTouchPanelDisable)
{
pfnTouchPanelDisable = (PFN_TOUCH_PANEL_DISABLE)GetProcAddress(g_hInstTouch,
TEXT("TouchPanelDisable"));
}
pfnTouchPanelDisable();
}
}
BOOL
TouchPanelEnable(
PFN_TOUCH_PANEL_CALLBACK pfnCallback
)
{
if(g_hInstTouch)
{
if (NULL == pfnTouchPanelEnable)
{
pfnTouchPanelEnable = (PFN_TOUCH_PANEL_ENABLE)GetProcAddress(g_hInstTouch,
TEXT("TouchPanelEnable"));
}
pfnOrgTouchPanelCallback = pfnCallback;
return pfnTouchPanelEnable(hwTouchPanelCallback);
}
return FALSE;
}
BOOL
TouchPanelGetDeviceCaps(
INT iIndex,
LPVOID lpOutput
)
{
if(g_hInstTouch)
{
if (NULL == pfnTouchPanelGetDeviceCaps)
{
pfnTouchPanelGetDeviceCaps = (PFN_TOUCH_PANEL_GET_DEVICE_CAPS)GetProcAddress(g_hInstTouch,
TEXT("TouchPanelGetDeviceCaps"));
}
return pfnTouchPanelGetDeviceCaps(iIndex ,lpOutput);
}
return FALSE;
}
VOID TouchPanelPowerHandler(
BOOL bOff
)
{
// 什么都不做,否则Suspend回来出问题
}
VOID TouchPanelReadCalibrationAbort(void)
{
if(g_hInstTouch)
{
if (NULL == pfnTouchPanelReadCalibrationAbort)
{
pfnTouchPanelReadCalibrationAbort = (PFN_TOUCH_PANEL_READ_CALIBRATION_ABORT)GetProcAddress(g_hInstTouch,
TEXT("TouchPanelReadCalibrationAbort"));
}
pfnTouchPanelReadCalibrationAbort();
}
}
BOOL TouchPanelReadCalibrationPoint(
INT* pRawX,
INT* pRawY
)
{
if(g_hInstTouch)
{
if (NULL == pfnTouchPanelReadCalibrationPoint)
{
pfnTouchPanelReadCalibrationPoint = (PFN_TOUCH_PANEL_READ_CALIBRATION_POINT)GetProcAddress(g_hInstTouch,
TEXT("TouchPanelReadCalibrationPoint"));
}
return pfnTouchPanelReadCalibrationPoint(pRawX, pRawY);
}
return FALSE;
}
BOOL TouchPanelSetCalibration(
INT32 cCalibrationPoints,
INT32* pScreenXBuffer,
INT32* pScreenYBuffer,
INT32* pUncalXBuffer,
INT32* pUncalYBuffer
)
{
if(g_hInstTouch)
{
if (NULL == pfnTouchPanelSetCalibration)
{
pfnTouchPanelSetCalibration = (PFN_TOUCH_PANEL_SET_CALIBRATION)GetProcAddress(g_hInstTouch,
TEXT("TouchPanelSetCalibration"));
}
return pfnTouchPanelSetCalibration(cCalibrationPoints,
pScreenXBuffer, pScreenYBuffer,pUncalXBuffer,pUncalYBuffer);
}
return FALSE;
}
BOOL TouchPanelSetMode(
INT iIndex,
LPVOID lpInput
)
{
if(g_hInstTouch)
{
if (NULL == pfnTouchPanelSetMode)
{
pfnTouchPanelSetMode = (PFN_TOUCH_PANEL_SET_MODE)GetProcAddress(g_hInstTouch,
TEXT("TouchPanelSetMode"));
}
return pfnTouchPanelSetMode(iIndex, lpInput);
}
return FALSE;
}