Windows Mobile 触摸屏(Touch Panel)截获(Touch Panel伪驱动)

来源:互联网 发布:腾讯软件有哪些 编辑:程序博客网 时间:2024/06/05 05:17

 .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;
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jinhaijian/archive/2008/09/26/2985384.aspx

原创粉丝点击