天天看點

Windows Mobile 觸摸屏(Touch Panel)截獲(Touch Panel僞驅動)

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;

}

繼續閱讀