⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rbutton.cpp

📁 这是一种声波触摸屏驱动中的左右键切换程序的源码。 vc
💻 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 + -