📄 rbutton.cpp
字号:
/* Windows program. 校准屏幕 */
#include <windows.h>
#include <winioctl.h>
#include "client.h"
#include "resource.h"
//常数定义
#define MAX_STRING 124
#define TEXT_WIDTH 100
#define TEXT_HEIGHT 50
#define FLAG_RADIUS 30
#define FLAG_SIZE 40
#define FLAG_PROP 4
#define FLAG_COLOR (RGB(0x10,0xef,0xef))
#define WM_ETTOUCH (WM_USER+1)
#define WM_ETESC (WM_USER+2)
// Global Variables:
HINSTANCE hInst; // The current instance
TCHAR szWindowClass[]="ETWOTOUCH RBUTTON"; // The name
HWND hWnd; // Handle to our window
HWND hframe; //框架
HANDLE hdev=NULL; //设备指针
RECT srect;
DWORD sbutton;
static HANDLE hbuttondn;
static HANDLE hbuttonup;
bool mode_r,hcapture;
// Global Variables:
HANDLE hthread; //校准检测线程
DWORD threadid; //线程ID
BOOL frun,fcal,fend; //线程运行标志、校准成功标志、程序运行标志
_CALIBRATION_DATA set_cal; //校准结果
// Declare functions
DWORD WINAPI ThreadProcess1(LPVOID ); //线程运行函数
ATOM RegisterWindowClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
MSG msg;
DWORD BytesReturned;
RegisterWindowClass(hInstance);
hInst = hInstance;
// Initialize application
if (!InitInstance (hInstance, nCmdShow)) return FALSE;
// Main message loop:
hdev=CreateFile("\\\\.\\ettouch",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (!(hdev==INVALID_HANDLE_VALUE)) { //设备指针有效
frun=TRUE;
fend=TRUE;
DeviceIoControl(hdev,IOCTL_ETTOUCH_GET_BUTTON_MODE,NULL,0,&sbutton,sizeof(DWORD),&BytesReturned,NULL);
SetWindowText(hWnd,sbutton==LEFTBUTTONMODE ? "左键" :"右键");
UpdateWindow(hWnd);
while (fend) {
// ShowCursor(FALSE);
hthread=CreateThread(NULL,0,ThreadProcess1,NULL,NULL,&threadid); //生成校准线程
if (hthread!=NULL) {
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
SuspendThread(hthread);
CloseHandle(hthread);
} else {
MessageBox(hWnd,"系统错误!资源不足",NULL,MB_OK); //线程无法生成
fend=FALSE;
}
}
CloseHandle(hdev);
return msg.wParam;
};
return (MessageBox(hWnd,"驱动程序没有加载!",NULL,MB_OK)); //打开设备失败
}
// Register the window class.
//
ATOM RegisterWindowClass(HINSTANCE hInstance) { //注册窗口
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
// wcex.hIcon = LoadIcon(hInstance,(LPCTSTR)IDI_ASTERISK);
wcex.hIcon = LoadIcon(hInstance,(LPCTSTR)IDI_ICON1);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);//+1);
wcex.lpszMenuName = NULL; //(LPCSTR)IDC_SECOND;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = NULL; //LoadIcon(wcex.hInstance,(LPCTSTR)IDI_SMALLICON);
return (RegisterClassEx(&wcex));
}
// Create the main window
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) {
if ((FindWindow(NULL,"左键")!=NULL) || (FindWindow(NULL,"右键")!=NULL)) return FALSE;
hWnd = CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
szWindowClass, "", //szTitle,
WS_OVERLAPPED ,//| WS_SYSMENU,//DS_SYSMODAL,//
500,100,64,64,NULL,NULL,hInstance, NULL);
if (!hWnd) return FALSE;
hbuttondn=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BUTTONDN));
hbuttonup=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BUTTONUP));
GetClientRect(hWnd,&srect); //获取屏幕尺寸
nCmdShow=SW_SHOW;
ShowWindow(hWnd, nCmdShow);
//UpdateWindow(hWnd);
return TRUE;
}
// Message processor.
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
DWORD BytesReturned;
switch (message) {
case WM_DESTROY: //程序结束
DeleteObject(hbuttondn);
DeleteObject(hbuttonup);
PostQuitMessage(0);
break;
case WM_SIZE:
break;
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc,hmemDC;
hdc=GetDC(hWnd);
hmemDC=CreateCompatibleDC(hdc);
BeginPaint(hWnd,&ps);
//DeviceIoControl(hdev,IOCTL_ETTOUCH_GET_BUTTON_MODE,NULL,0,&sbutton,sizeof(DWORD),&BytesReturned,NULL);
if (sbutton==LEFTBUTTONMODE) //按鼠标仿真模式显示图案
SelectObject(hmemDC,hbuttonup);
else
SelectObject(hmemDC,hbuttondn);
StretchBlt(hdc,0,0,64,64,hmemDC,0,0,64,64,SRCCOPY);
EndPaint(hWnd,&ps);
DeleteDC(hmemDC);
ReleaseDC(hWnd,hdc);
break;
case WM_LBUTTONUP:
sbutton=RIGHTBUTTONMODE;
DeviceIoControl(hdev,IOCTL_ETTOUCH_SET_BUTTON_MODE,&sbutton,sizeof(DWORD),NULL,0,&BytesReturned,NULL);
UpdateWindow(hWnd);
SetWindowText(hWnd,"右键");
InvalidateRect(hWnd,&srect,TRUE);
// MessageBox(hWnd,"切换到右键!",NULL,MB_OK);
frun=true; //启动触摸监视线程
break;
case WM_RBUTTONUP:
case WM_ETTOUCH:
sbutton=LEFTBUTTONMODE;
DeviceIoControl(hdev,IOCTL_ETTOUCH_SET_BUTTON_MODE,&sbutton,sizeof(DWORD),NULL,0,&BytesReturned,NULL);
UpdateWindow(hWnd);
SetWindowText(hWnd,"左键"); //显示当前鼠标仿真状态
InvalidateRect(hWnd,&srect,TRUE);
frun=false; //停止触摸监视线程
// MessageBox(hWnd,"切换到左键!",NULL,MB_OK);
break;
case WM_NCLBUTTONDBLCLK :
PostMessage(hWnd,WM_DESTROY,0,0);
fend=false; //结束主消息循环
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
// 转换为右键后的第一次触摸监视线程.
DWORD WINAPI ThreadProcess1(LPVOID param) {// 线程监视转换成右键后的第一次触摸
DWORD BytesReturned;
_CALIBRATE_DATA cal_info;
while(frun ) {
frun=false;
while (!frun){ Sleep(30); } //等待线程启动
//利用设备驱动中的校准标志字节监视一次触摸的完成
DeviceIoControl(hdev,IOCTL_ETTOUCH_RESET_CALINFO,NULL,0,NULL,0,&BytesReturned,NULL); //设置驱动为待校准
cal_info.Cal_State=CALIBRATE_NOTREADY;
while (frun && (cal_info.Cal_State!=CALIBRATE_READY)) {
//监视原始数据 直到完成一次触摸
DeviceIoControl(hdev,IOCTL_ETTOUCH_GET_CALINFO,NULL,0,&cal_info,sizeof(_CALIBRATE_DATA),&BytesReturned,NULL);
Sleep(50);
}
PostMessage(hWnd,WM_ETTOUCH,0,0); //发出触摸一次信号
frun=true;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -