系统相关功能开发(十)-鼠标键盘

1.交换鼠标左右键

void CMouseKeyBordSampleDlg::OnButSwap()	// 交换鼠标左右键
{	
	if (SwapMouseButton(TRUE))				// 交换鼠标左右键
		WriteLog("鼠标左右键已经交换");		// 输出错误提示信息
	else
        WriteLog("交换鼠标左右键成功");	// 输出提示信息
}


void CMouseKeyBordSampleDlg::OnButRestoreswap()		// 恢复鼠标左右键
{	
	if (SwapMouseButton(FALSE))				// 恢复鼠标左右键
		WriteLog("恢复鼠标左右键成功");		// 输出提示信息
	else
        WriteLog("交换鼠标左右键成功");	// 输出错误提示信息
}

2.设置鼠标双击时间间隔

void CMouseKeyBordSampleDlg::OnButSetdoubletime()	// 设置鼠标双击时间间隔
{
	UpdateData(TRUE);						// 获取要设置的鼠标双击时间间隔
	BOOL bResult = SetDoubleClickTime(m_DoubleClickTime);	// 设置双击时间间隔值
	UINT dcTime = GetDoubleClickTime();						// 获取双击时间间隔值
	WriteLog("设置鼠标双击时间间隔%s,当前值为%d", bResult ? "成功": "失败", dcTime);		
}

3. 获得鼠标键数

void CMouseKeyBordSampleDlg::OnButtonGetbuttons()	// 获得鼠标键数
{
	int iButtons = GetSystemMetrics(SM_CMOUSEBUTTONS);	// 调用GetSystemMetrics函数获取按键数
	if (iButtons > 0)									// 如果大于0,输出按键数
		WriteLog("当前系统中共有%d个鼠标按键", iButtons);
	else
        WriteLog("当前系统中没有安装鼠标");			// 否则,系统中没有安装鼠标
}

4.捕获鼠标的窗体句柄

void CMouseKeyBordSampleDlg::OnButHwnd()	// 启动捕获鼠标窗体的定时器
{
	SetTimer(100, 1000, NULL);	
}

void CMouseKeyBordSampleDlg::OnTimer(UINT nIDEvent)		// 定时器处理函数
{	
	HWND m_hWnd  = ::GetCapture();						// 捕获鼠标窗体
	WriteLog("当前捕获鼠标的窗体的HWND=0x%08X", m_hWnd);// 输出句柄
	CDialog::OnTimer(nIDEvent);							// 调用基类处理函数
}

5.模拟鼠标


void CMouseKeyBordSampleDlg::OnButSendmouse()			// 模拟鼠标左键
{
	mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP , 0, 0, NULL, NULL);	// 模拟鼠标左键
}

6.在对话框中使用加速键

void CMouseKeyBordSampleDlg::OnButRegisthotkey()	// 在对话框中使用加速键
{
	if(RegisterHotKey(this->m_hWnd, VK_F1+1, MOD_CONTROL, VK_F1+1))	// 注册加速键
		WriteLog("注册加速键成功");					// 输出提示信息
	else WriteLog("注册加速键失败");				// 输出错误信息	
}


LRESULT CMouseKeyBordSampleDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) // 窗口消息处理函数
{
	char szName[MAX_PATH]={0};				// 定义名称变量
	UINT fuModifiers,uVirtKey;				// 定义按键变量
	switch(message)							// 判断消息
	{
	case WM_LBUTTONDOWN:
		WriteLog("按下鼠标左键");	
		break;
	case WM_LBUTTONUP:
		WriteLog("抬起鼠标左键");
		break;
	case WM_KEYDOWN:		
		TCHAR szName[200];
		GetKeyNameText(wParam, szName, sizeof(szName));
		WriteLog("按下%s按键", szName);
		break;
	case WM_HOTKEY:							// 接收到加速键
		uVirtKey = MapVirtualKey((UINT)HIWORD(lParam), 0)<<16;		// 获取功能按键
		if (GetKeyNameText(uVirtKey, (LPTSTR)szName, sizeof(szName)))	// 获取按键名称
			WriteLog("加速键=%s", szName);							// 输出按键名称
		fuModifiers = (UINT) LOWORD(lParam);						// 取组合功能键		
		switch(fuModifiers)		// 判断组合键
		{
		case MOD_ALT:			// ALT键
			WriteLog("(按下ALT组合键)");	break;
		case MOD_CONTROL:		// CTRL键
			WriteLog("(按下CTRL组合键)");	break;
		case MOD_SHIFT:			// SHIFT键
			WriteLog("(按下SHIFT组合键)");break;
		case MOD_WIN:			// WIN键
			WriteLog("(按下WIN组合键)");	break;
		}		
		break;
	default:
		break;
	}	
	return CDialog::WindowProc(message, wParam, lParam);
}

7.获取键盘类型

void CMouseKeyBordSampleDlg::OnButtonGetkeyboard()	// 获取键盘类型
{
	CString type[8]={"获取键盘类型失败", "IBM PC/XT or compatible (83-key) keyboard",
	"Olivetti 'ICO' (102-key) keyboard", "IBM PC/AT (84-key) or similar keyboard",
	"IBM enhanced (101- or 102-key) keyboard", "Nokia 1050 and similar keyboards",
	"Nokia 9140 and similar keyboards", "Japanese keyboard"};	// 定义键盘类型名称
	CString funKeys[8]={"获取键盘功能键数目失败", "10", "12,有时是18","10", "12",
	"10", "24","根据OEM厂商而定"};				// 定义键盘功能按键数
	int keyboardType = GetKeyboardType(0);		// 获取键盘类型
	int keyboardSubType = GetKeyboardType(1);	// 获取键盘子类型
	int functionsKeys = GetKeyboardType(2);		// 获取键盘功能按键数	
	if (keyboardType < 8)	WriteLog("键盘类型=%s", type[keyboardType]);	// 输出键盘类型
	else WriteLog("键盘类型未知");
	WriteLog("键盘子类型=%d(具体含义,需要根据键盘类型的不同进行判断)", keyboardSubType);	// 输出键盘子类型
	if (functionsKeys < 8)	WriteLog("键盘功能键数目=%s\r\n", type[functionsKeys]);	// 输出键盘功能按键数
	else WriteLog("键盘功能键数目未知");	
}

8. 控制键盘指示灯

void CMouseKeyBordSampleDlg::OnButControlkey()	// 控制键盘指示灯
{
	int keys[] = {VK_CAPITAL, VK_NUMLOCK,VK_SCROLL};	// 定义控制的指示灯
	CString keysName[] = {"VK_CAPITAL", "VK_NUMLOCK","VK_SCROLL"};	// 定义指示灯名称
	for (int i = 0;i < sizeof(keys)/sizeof(int);i ++)	// 依次控制各个指示灯状态
	{	
		keybd_event( keys[i], 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0 );  // 切换指示灯状态
		keybd_event( keys[i], 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);// 切换指示灯状态
	}
	BYTE keyState[MAX_PATH]={0};				// 指示灯状态数组
	GetKeyboardState((LPBYTE)&keyState);		// 获取键盘状态
	for (int i = 0;i < sizeof(keys)/sizeof(int);i ++)		// 依次获取指示灯状态
		WriteLog("%s当前%s", keysName[i], keyState[keys[i]] == 1 ? "灯灭" : "灯亮");// 输出指示灯状态
}




















猜你喜欢

转载自blog.csdn.net/greless/article/details/77583947