📄 gwme.c
字号:
static VOID CALLBACK SetCalibrationXY(int x, int y)
{
if( !hWndCalibrate )
return;
RETAILMSG( 1, ( "SetCalibrationXY:x=%d,y=%d.\r\n", x, y ) );
PostMessage( hWndCalibrate, WM_LBUTTONDOWN, 0, MAKELONG( x, y ) );
}
BOOL WINAPI WinSys_SetCalibrateWindow( HWND hWnd )
{
if( hWnd )
{
if( lpGwdiPosEnter )
{
lpGwdiPosEnter( GWDI_CALIBRATION, CALIBRATION_DOWN, SetCalibrationXY );
hWndCalibrate = hWnd;
}
}
else
{
hWndCalibrate = NULL; //clear cal state
if( lpGwdiPosEnter )
lpGwdiPosEnter( GWDI_CALIBRATION, CALIBRATION_INACIVE, 0 ); //完成
}
return TRUE;
}
BOOL WINAPI WinSys_SetCalibratePoints( int cCalibrationPoints, int *pScreenXBuffer,int *pScreenYBuffer, int *pUncalXBuffer, int *pUncalYBuffer )
{
return TouchPanelSetCalibration( cCalibrationPoints, pScreenXBuffer, pScreenYBuffer, pUncalXBuffer, pUncalYBuffer );
}
// **************************************************
// 声明:static BOOL CALLBACK DoEnumAPMQUERYSUSPEND( HWND hWnd, LPARAM lParam )
// 参数:
// IN hWnd - 窗口句柄
// IN lParam - 附带的用户参数
// 返回值:
// 如果继续,返回TRUE;否则,返回FALSE
// 功能描述:
// 枚举通知功能
// 引用:
//
// ************************************************
#define DEBUG_DoEnumAPMQUERYSUSPEND 0
static BOOL CALLBACK DoEnumAPMQUERYSUSPEND( HWND hWnd, LPARAM lParam )
{
LRESULT lret;
SendMessageTimeout( hWnd, WM_POWERBROADCAST, PBT_APMQUERYSUSPEND, lParam, SMTO_NORMAL, 10000, &lret );
if( lret == BROADCAST_QUERY_DENY )
{
WARNMSG( DEBUG_DoEnumAPMQUERYSUSPEND, ( "hWnd(0x%x) return deny.\r\n", hWnd ) );
return FALSE;
}
return TRUE;
}
// **************************************************
// 声明:static BOOL CALLBACK DoEnumAPMSUSPEND( HWND hWnd, LPARAM lParam )
// 参数:
// IN hWnd - 窗口句柄
// IN lParam - 附带的用户参数
// 返回值:
// 如果继续,返回TRUE;否则,返回FALSE
// 功能描述:
// 枚举挂起功能
// 引用:
//
// ************************************************
static BOOL CALLBACK DoEnumAPMSUSPEND( HWND hWnd, LPARAM lParam )
{
LRESULT lret;
SendMessageTimeout( hWnd, WM_POWERBROADCAST, PBT_APMSUSPEND, 0, SMTO_NORMAL, 10000, &lret );
return TRUE;
}
// **************************************************
// 声明:static BOOL CALLBACK DoPostAPMQUERYSUSPENDFAILED(VOID)
// 参数:
// IN hWnd - 窗口句柄
// IN lParam - 附带的用户参数
// 返回值:
// 如果继续,返回TRUE;否则,返回FALSE
// 功能描述:
// 通知所有窗口挂起失败
// 引用:
//
// ************************************************
static BOOL CALLBACK DoPostAPMQUERYSUSPENDFAILED(VOID)
{
// LRESULT lret;
PostMessage( HWND_BROADCAST, WM_POWERBROADCAST, PBT_APMQUERYSUSPENDFAILED, 0 );
return TRUE;
}
// **************************************************
// 声明:static BOOL CALLBACK DoPostAPMRESUMESUSPEND(VOID)
// 参数:
// IN hWnd - 窗口句柄
// IN lParam - 附带的用户参数
// 返回值:
// 如果继续,返回TRUE;否则,返回FALSE
// 功能描述:
// 从挂起中返回,恢复所有窗口
// 引用:
//
// ************************************************
static BOOL CALLBACK DoPostAPMRESUMESUSPEND(VOID)
{
PostMessage( HWND_BROADCAST, WM_POWERBROADCAST, PBT_APMRESUMESUSPEND, 0 );
return TRUE;
}
#define DEBUG_DoPower 1
static DWORD DoPower( HANDLE hServer, DWORD dwParam, LPVOID lpParam )
{
DWORD dwRetv = 0;
DEBUGMSG( DEBUG_DoPower, ( "GWME-DoPower entry.\r\n" ) );
if( dwParam == SBP_APMQUERYSUSPEND )
{ //查寻挂起许可
if( DoEnumTopLevelWindow( DoEnumAPMQUERYSUSPEND, 0, NULL ) == FALSE )
{ //许可挂起失败
DoPostAPMQUERYSUSPENDFAILED();
dwRetv = FALSE;
}
else
dwRetv = TRUE;
}
else if( dwParam == SBP_APMSUSPEND )
{ //通知挂起
DoEnumTopLevelWindow( DoEnumAPMSUSPEND, 0, NULL );
if( lpGwdiDisplayEnter )
{
lpGwdiDisplayEnter( GWDI_POWEROFF, 0, 0 );
}
if( lpGwdiPosEnter )
{
lpGwdiPosEnter( GWDI_POWEROFF, 0, 0 );
}
if( lpGwdiKeyEnter )
{
lpGwdiKeyEnter( GWDI_POWEROFF, 0, 0 );
}
}
else if( dwParam == SBP_APMQUERYSUSPENDFAILED )
{ //系统挂起请求失败
DoPostAPMQUERYSUSPENDFAILED();
}
else if( dwParam == SBP_APMRESUMESUSPEND )
{ //挂起后的恢复
if( lpGwdiDisplayEnter )
{
lpGwdiDisplayEnter( GWDI_POWERON, 0, 0 );
}
if( lpGwdiPosEnter )
{
lpGwdiPosEnter( GWDI_POWERON, 0, 0 );
}
if( lpGwdiKeyEnter )
{
lpGwdiKeyEnter( GWDI_POWERON, 0, 0 );
}
DoPostAPMRESUMESUSPEND();
}
DEBUGMSG( DEBUG_DoPower, ( "GWME-DoPower leave,dwRetv(%d).\r\n", dwRetv ) );
return dwRetv;
}
// **************************************************
// 声明:DWORD WINAPI GwmeServerHandler( HANDLE hServer, DWORD dwIoControlCode , DWORD dwParam, LPVOID lpParam )
// 参数:
// IN hServer - 服务句柄
// IN dwIoControlCode - 控制码
// IN dwParam - 第一个参数
// IN lpParam - 第二个参数
// 返回值:
// 依赖与不同的控制
// 功能描述:
// 服务总线控制,处理各种系统服务,通知功能
// 引用:
//
// ************************************************
#define DEBUG_GwmeServerHandler 1
DWORD WINAPI GwmeServerHandler( HANDLE hServer, DWORD dwServerCode , DWORD dwParam, LPVOID lpParam )
{
switch( dwServerCode )
{
case SCC_BROADCAST_THREAD_EXIT:
Win_Clear(dwParam);
break;
case SCC_BROADCAST_PROCESS_EXIT:
WinClass_Clear( (HANDLE)dwParam);
WinSys_CloseObject( (HANDLE)dwParam );
_ClearProcessTimer( (HANDLE)dwParam );
break;
case SCC_BROADCAST_POWER:
return DoPower( hServer, dwParam, lpParam );
case SCC_BROADCAST_SHUTDOWN:
DoEnumTopLevelWindow( DoEnumAPMSUSPEND, 0, NULL );
break;
default:
return Sys_DefServerProc( hServer, dwServerCode , dwParam, lpParam );
}
return 0;
}
// **************************************************
// 声明:int CALLBACK WinMain(
// HINSTANCE hInstance,
// HINSTANCE hPrevInstance,
// LPSTR lpCmdLine,
// int nCmdShow)
// 参数:
// IN hInstance - 进程实例句柄
// IN hPrevInstance - 前一个进程实例句柄(无用)
// IN lpCmdLine - 命令行
// IN nCmdShow - 怎样显示主窗口
// 返回值:
// 依赖与不同的控制
// 功能描述:
// GWME进程总入口
// 引用:
//
// ************************************************
#define DEBUG_GWME 0
#ifdef INLINE_PROGRAM
int CALLBACK Gwme_WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
#else
int CALLBACK WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
#endif
{
HANDLE hActiveTimerEvent;
DWORD dwCurTickCount;
//防止重复加载
if( API_IsReady( API_GWE ) )
{
DEBUGMSG( DEBUG_GWME, ( "the gwme has already load.exit!\r\n" ) );
return -1;
}
hgwmeInstance = hInstance;
DEBUGMSG( DEBUG_GWME, ( "gwme hInstance=%x.\r\n", hInstance ) );
//得到当前进程真实句柄
hgwmeProcess = OpenProcess( PROCESS_ALL_ACCESS, 0, GetCurrentProcessId() );//GetCurrentProcess();
//需要文件系统,看是否准备好 ?
while( API_IsReady( API_FILESYS ) == FALSE )
{
Sleep(100);
}
//初始化块堆管理模块
InitGwmeBlockHeap();
//安装 GWME 服务器
InstallGwmeServer();
//初始化 GWME 设备,例如:mouse, displayer keyboard..
InstallGwmeDevice( hInstance );
//初始化 GWME 图形对象
InstallGwmeObject( hInstance );
//安装 GWME 系统资源
//LoadGwmeResource( hInstance );
//打开设备
OpenGwmeDevice();
_InitCalibration();
API_SetReady( API_GWE );
DEBUGMSG( DEBUG_GWME, ( "GWE is ready.\r\n" ) );
hgwmeEvent = CreateEvent( NULL, FALSE, FALSE, "GWME_EVENT" );
hActiveTimerEvent = CreateEvent( NULL, FALSE, FALSE, "__GWME_ACTIVE_TIMER__" );
dwActiveTimerCount = GetTickCount();
while( 1 )
{
int rv;
//等待事件
//50是用来做WM_TIMER的处理的
rv = WaitForSingleObject( hgwmeEvent, 50 );
if( rv == WAIT_TIMEOUT )
{ // 检查所有 timer 事件
CheckWinTimerEvent();
}
else if( rv == WAIT_OBJECT_0 )
{ // gwme event
;//RETAILMSG( 1, ( "Gwme event\r\n." ) );
}
else // if( rv == WAIT_OBJECT_0 + 1 )
{
;//break;
}
if( GetSYSQueueState() ) //系统队列是否有消息、事件 ?
{ //有
HandleSystemQueue();
}
//判断用户输入事件响应时间
dwCurTickCount = GetTickCount();
if( ( dwCurTickCount - dwActiveTimerCount ) >= 10000 )
{
dwActiveTimerCount = GetTickCount();
SetEvent(hActiveTimerEvent);
}
}
while(1)
Sleep(10);
CloseHandle( hgwmeEvent );
ReleaseGwme();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -