在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例Windows系统编程 → c++ 键盘测试程序源码下载

c++ 键盘测试程序源码下载

Windows系统编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.96M
  • 下载次数:110
  • 浏览次数:418
  • 发布时间:2016-11-18
  • 实例类别:Windows系统编程
  • 发 布 人:serayserver
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 键盘 测试

实例介绍

【实例简介】

【实例截图】

【核心代码】


// KeyTestDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "KeyTest.h"
#include "KeyTestDlg.h"
#include "afxdialogex.h"
#include <string>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 链接钩子库
#pragma comment(lib, "../Release/Filter.lib")
_declspec(dllimport) void SetKeyFilter(HWND);

// 全局变量
BOOL dwnflag = FALSE;
BOOL upflag = FALSE;
BYTE KeyboardState[256];
CMFCButton* keys[256];
CMFCButton* keys2[256];
BYTE passed[256];
BYTE passed2[256];
int m_passed;

TCHAR szKeyName[32] = " ";
TCHAR szBuffer[256] = " ";

LOGFONT logfont;
CFont font, font2, font3, font4;
COLORREF clrLightGray = RGB(239, 239, 239);
COLORREF green = RGB(0, 255, 0);
COLORREF lgreen = RGB(0, 128, 0);
COLORREF blue = RGB(0, 0, 255);
COLORREF lblue = RGB(0, 0, 64);
COLORREF gb = RGB(0, 128, 128);

HWND	g_hWnd;
HHOOK	g_hMouse = NULL;
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	MOUSEHOOKSTRUCT* Mouse_Info = (MOUSEHOOKSTRUCT*)lParam;
	POINT	pt;
	pt.x = Mouse_Info->pt.x;
	pt.y = Mouse_Info->pt.y;
	ScreenToClient(g_hWnd, &pt);
	if (HC_ACTION == nCode)
		if (WM_LBUTTONDOWN == wParam)
		{  
			/*
			FILE* ofile = fopen("log.txt", "a");
			//fprintf(ofile, "%d, %d\n", Mouse_Info->pt.x, Mouse_Info->pt.y);
			fprintf(ofile, "%d, %d\n", pt.x, pt.y);
			fclose(ofile);
			*/
			// 屏蔽处“重新测试”和“测试完成”两个按钮之外的所有区域的鼠标响应
			if ( pt.y > 50 || pt.x < 140 || pt.x > 525)
				return 1;
		}
	return CallNextHookEx(g_hMouse, nCode, wParam, lParam);	// 回调
}

// CKeyTestDlg 对话框

CKeyTestDlg::CKeyTestDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CKeyTestDlg::IDD, pParent)
{
	m_passed = 0;
	for (int i = 0; i < 256;   i)
	{
		keys[i] = NULL;
		passed[i] = 0;
		passed2[i] = 0;
	}

	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CKeyTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);

	DDX_Control(pDX, IDC_BUTTON_A, m_a);
	DDX_Control(pDX, IDC_BUTTON_B, m_b);
	DDX_Text(pDX, IDC_EDIT_PASSED, m_passed);
	DDX_Control(pDX, IDC_BUTTON_LCTR, m_lctrl);
	DDX_Control(pDX, IDC_BUTTON_RCTR, m_rctrl);
	DDX_Control(pDX, IDC_BUTTON_ESC, m_esc);
	DDX_Control(pDX, IDC_BUTTON_PRT, m_print);
	DDX_Control(pDX, IDC_BUTTON_ENTER, m_enter);
	DDX_Control(pDX, IDC_BUTTON_F1, m_f1);
	DDX_Control(pDX, IDC_BUTTON_F2, m_f2);
	DDX_Control(pDX, IDC_BUTTON_F3, m_f3);
	DDX_Control(pDX, IDC_BUTTON_F4, m_f4);
	DDX_Control(pDX, IDC_BUTTON_F5, m_f5);
	DDX_Control(pDX, IDC_BUTTON_F6, m_f6);
	DDX_Control(pDX, IDC_BUTTON_F7, m_f7);
	DDX_Control(pDX, IDC_BUTTON_F8, m_f8);
	DDX_Control(pDX, IDC_BUTTON_F9, m_f9);
	DDX_Control(pDX, IDC_BUTTON_F10, m_f10);
	DDX_Control(pDX, IDC_BUTTON_F11, m_f11);
	DDX_Control(pDX, IDC_BUTTON_F12, m_f12);
	DDX_Control(pDX, IDC_BUTTON_DOT, m_dot);
	DDX_Control(pDX, IDC_BUTTON_ONE, m_one);
	DDX_Control(pDX, IDC_BUTTON_TWO, m_two);
	DDX_Control(pDX, IDC_BUTTON_THREE, m_three);
	DDX_Control(pDX, IDC_BUTTON_FOURT, m_four);
	DDX_Control(pDX, IDC_BUTTON_FIVE, m_five);
	DDX_Control(pDX, IDC_BUTTON_SIX, m_six);
	DDX_Control(pDX, IDC_BUTTON_SEVEN, m_seven);
	DDX_Control(pDX, IDC_BUTTON_EIGHT, m_eight);
	DDX_Control(pDX, IDC_BUTTON_NINE, m_nine);
	DDX_Control(pDX, IDC_BUTTON_ZERO, m_zero);
	DDX_Control(pDX, IDC_BUTTON_SUB, m_sub);
	DDX_Control(pDX, IDC_BUTTON_EQAUL, m_equal);
	DDX_Control(pDX, IDC_BUTTON_BACK, m_back);
	DDX_Control(pDX, IDC_BUTTON_TAB, m_tab);
	DDX_Control(pDX, IDC_BUTTON_Q, m_q);
	DDX_Control(pDX, IDC_BUTTON_W, m_w);
	DDX_Control(pDX, IDC_BUTTON_E, m_e);
	DDX_Control(pDX, IDC_BUTTON_R, m_r);
	DDX_Control(pDX, IDC_BUTTON_T, m_t);
	DDX_Control(pDX, IDC_BUTTON_Y, m_y);
	DDX_Control(pDX, IDC_BUTTON_U, m_u);
	DDX_Control(pDX, IDC_BUTTON_I, m_i);
	DDX_Control(pDX, IDC_BUTTON_O, m_o);
	DDX_Control(pDX, IDC_BUTTON_P, m_p);
	DDX_Control(pDX, IDC_BUTTON_LBRK, m_lbrk);
	DDX_Control(pDX, IDC_BUTTON_RBRK, m_rbrk);
	DDX_Control(pDX, IDC_BUTTON_SLASH, m_slash);
	DDX_Control(pDX, IDC_BUTTON_CAPS, m_caps);
	DDX_Control(pDX, IDC_BUTTON_S, m_s);
	DDX_Control(pDX, IDC_BUTTON_D, m_d);
	DDX_Control(pDX, IDC_BUTTON_F, m_f);
	DDX_Control(pDX, IDC_BUTTON_G, m_g);
	DDX_Control(pDX, IDC_BUTTON_H, m_h);
	DDX_Control(pDX, IDC_BUTTON_J, m_j);
	DDX_Control(pDX, IDC_BUTTON_K, m_k);
	DDX_Control(pDX, IDC_BUTTON_L, m_l);
	DDX_Control(pDX, IDC_BUTTON_SCOLON, m_scolon);
	DDX_Control(pDX, IDC_BUTTON_QUOT, m_quot);
	DDX_Control(pDX, IDC_BUTTON_LSHIFT, m_lshift);
	DDX_Control(pDX, IDC_BUTTON_Z, m_z);
	DDX_Control(pDX, IDC_BUTTON_X, m_x);
	DDX_Control(pDX, IDC_BUTTON_V, m_v);
	DDX_Control(pDX, IDC_BUTTON_N, m_n);
	DDX_Control(pDX, IDC_BUTTON_M, m_m);
	DDX_Control(pDX, IDC_BUTTON_COM, m_com);
	DDX_Control(pDX, IDC_BUTTON_PEO, m_peo);
	DDX_Control(pDX, IDC_BUTTON_BSLASH, m_bslash);
	DDX_Control(pDX, IDC_BUTTON_RSHIFT, m_rshift);
	DDX_Control(pDX, IDC_BUTTON_LWIN, m_lwin);
	DDX_Control(pDX, IDC_BUTTON_LALT, m_lalt);
	DDX_Control(pDX, IDC_BUTTON_SPACE, m_space);
	DDX_Control(pDX, IDC_BUTTON_RALT, m_ralt);
	DDX_Control(pDX, IDC_BUTTON_RWIN, m_rwin);
	DDX_Control(pDX, IDC_BUTTON_APP, m_app);
	DDX_Control(pDX, IDC_BUTTON_SCROLL, m_scroll);
	DDX_Control(pDX, IDC_BUTTON_BREAK, m_break);
	DDX_Control(pDX, IDC_BUTTON_INSERT, m_insert);
	DDX_Control(pDX, IDC_BUTTON_HOME, m_home);
	DDX_Control(pDX, IDC_BUTTON_PUP, m_pup);
	DDX_Control(pDX, IDC_BUTTON_DELETE, m_delete);
	DDX_Control(pDX, IDC_BUTTON_END, m_end);
	DDX_Control(pDX, IDC_BUTTON_PDWN, m_pdwn);
	DDX_Control(pDX, IDC_BUTTON_UP, m_up);
	DDX_Control(pDX, IDC_BUTTON_LEFT, m_left);
	DDX_Control(pDX, IDC_BUTTON_DOWN, m_down);
	DDX_Control(pDX, IDC_BUTTON_RIGHT, m_right);
	DDX_Control(pDX, IDC_BUTTON_NLOCK, m_nlock);
	DDX_Control(pDX, IDC_BUTTON_NBSLASH, m_nbslash);
	DDX_Control(pDX, IDC_BUTTON_NSTAR, m_nstar);
	DDX_Control(pDX, IDC_BUTTON_NSUB, m_nsub);
	DDX_Control(pDX, IDC_BUTTON_NSEVEN, m_nseven);
	DDX_Control(pDX, IDC_BUTTON_NEIGHT, m_neight);
	DDX_Control(pDX, IDC_BUTTON_NNINE, m_nnine);
	DDX_Control(pDX, IDC_BUTTON_NFOUR, m_nfour);
	DDX_Control(pDX, IDC_BUTTON_NFIVE, m_nfive);
	DDX_Control(pDX, IDC_BUTTON_NSIX, m_nfix);
	DDX_Control(pDX, IDC_BUTTON_NONE, m_none);
	DDX_Control(pDX, IDC_BUTTON_NTWO, m_ntwo);
	DDX_Control(pDX, IDC_BUTTON_NTHREE, m_nthree);
	DDX_Control(pDX, IDC_BUTTON_NZERO, m_nzero);
	DDX_Control(pDX, IDC_BUTTON_NDOT, m_ndot);
	DDX_Control(pDX, IDC_BUTTON_NENTER, m_nenter);
	DDX_Control(pDX, IDC_BUTTON_NADD, m_nadd);
	DDX_Control(pDX, IDC_BUTTON_C, m_c);
	DDX_Control(pDX, IDC_BUTTON_MUTE, m_mute);
	DDX_Control(pDX, IDC_BUTTON_VDOWN, m_vdown);
	DDX_Control(pDX, IDC_BUTTON_VUP, m_vup);
	DDX_Control(pDX, IDC_BUTTON_PREV, m_prev);
	DDX_Control(pDX, IDC_BUTTON_PAUSE, m_pause);
	DDX_Control(pDX, IDC_BUTTON_NEXT, m_next);
	DDX_Control(pDX, IDC_BUTTON_FN, m_fn);
	DDX_Control(pDX, IDC_BUTTON_MUSIC, m_music);
	DDX_Control(pDX, IDC_BUTTON_STOP, m_stop);

	//DDX_Control(pDX, IDC_RADIO_NUM, *num);

	//DDX_Control(pDX, IDC_BUTTON_CLEAR, m_clear);
	//DDX_Control(pDX, IDC_BUTTON_DONE, m_done);
}

BEGIN_MESSAGE_MAP(CKeyTestDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//ON_BN_CLICKED(IDC_BUTTON_DONE, &CKeyTestDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON_CLEAR, &CKeyTestDlg::OnBnClickedButtonClear)
	ON_BN_CLICKED(IDC_BUTTON_DONE, &CKeyTestDlg::OnBnClickedButtonDone)
	ON_WM_NCHITTEST()
	ON_WM_LBUTTONDOWN()
	ON_WM_CTLCOLOR()
	ON_WM_SIZE()
END_MESSAGE_MAP()


// CKeyTestDlg 消息处理程序

BOOL CKeyTestDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);	// 对话框置顶

	// 初始化按键数组
	keys[VK_ESCAPE] = &m_esc;
	keys[VK_F1] = &m_f1;
	keys[VK_F2] = &m_f2;
	keys[VK_F3] = &m_f3;
	keys[VK_F4] = &m_f4;
	keys[VK_F5] = &m_f5;
	keys[VK_F6] = &m_f6;
	keys[VK_F7] = &m_f7;
	keys[VK_F8] = &m_f8;
	keys[VK_F9] = &m_f9;
	keys[VK_F10] = &m_f10;
	keys[VK_F11] = &m_f11;
	keys[VK_F12] = &m_f12;
	keys[0xC0] = &m_dot;
	keys['1'] = &m_one;
	keys['2'] = &m_two;
	keys['3'] = &m_three;
	keys['4'] = &m_four;
	keys['5'] = &m_five;
	keys['6'] = &m_six;
	keys['7'] = &m_seven;
	keys['8'] = &m_eight;
	keys['9'] = &m_nine;
	keys['0'] = &m_zero;
	keys[0xBD] = &m_sub;
	keys[0xBB] = &m_equal;
	keys[VK_BACK] = &m_back;
	keys[VK_TAB] = &m_tab;
	keys['Q'] = &m_q;
	keys['W'] = &m_w;
	keys['E'] = &m_e;
	keys['R'] = &m_r;
	keys['T'] = &m_t;
	keys['Y'] = &m_y;
	keys['U'] = &m_u;
	keys['I'] = &m_i;
	keys['O'] = &m_o;
	keys['P'] = &m_p;
	keys[0xDB] = &m_lbrk;
	keys[0xDD] = &m_rbrk;
	keys[0xDC] = &m_slash;
	keys[VK_CAPITAL] = &m_caps;
	keys['A'] = &m_a;
	keys['S'] = &m_s;
	keys['D'] = &m_d;
	keys['F'] = &m_f;
	keys['G'] = &m_g;
	keys['H'] = &m_h;
	keys['J'] = &m_j;
	keys['K'] = &m_k;
	keys['L'] = &m_l;
	keys[0xBA] = &m_scolon;
	keys[0xDE] = &m_quot;
	keys[VK_RETURN] = &m_enter;
	keys[VK_SHIFT] = &m_lshift;
	keys['Z'] = &m_z;
	keys['X'] = &m_x;
	keys['C'] = &m_c;
	keys['V'] = &m_v;
	keys['B'] = &m_b;
	keys['N'] = &m_n;
	keys['M'] = &m_m;
	keys[0xBC] = &m_com;
	keys[0xBE] = &m_peo;
	keys[0xBF] = &m_bslash;
	keys2[VK_SHIFT] = &m_rshift;	// 1
	keys[VK_CONTROL] = &m_lctrl;
	keys[VK_LWIN] = &m_lwin;
	keys[VK_MENU] = &m_lalt;
	keys[VK_SPACE] = &m_space;
	keys2[VK_MENU] = &m_ralt;		// 2
	keys[VK_RWIN] = &m_rwin;
	keys[VK_APPS] = &m_app;
	keys2[VK_CONTROL] = &m_rctrl;	// 3
	keys[VK_SNAPSHOT] = &m_print;
	keys[VK_SCROLL] = &m_scroll;
	keys[VK_PAUSE] = &m_break;
	keys[VK_INSERT] = &m_insert;
	keys[VK_HOME] = &m_home;
	keys[VK_PRIOR] = &m_pup;
	keys[VK_DELETE] = &m_delete;
	keys[VK_END] = &m_end;
	keys[VK_NEXT] = &m_pdwn;
	keys[VK_UP] = &m_up;
	keys[VK_LEFT] = &m_left;
	keys[VK_DOWN] = &m_down;
	keys[VK_RIGHT] = &m_right;
	keys[VK_NUMLOCK] = &m_nlock;
	keys[VK_DIVIDE] = &m_nbslash;
	keys[VK_MULTIPLY] = &m_nstar;
	keys[VK_SUBTRACT] = &m_nsub;
	keys[VK_NUMPAD7] = &m_nseven;
	keys[VK_NUMPAD8] = &m_neight;
	keys[VK_NUMPAD9] = &m_nnine;
	keys[VK_NUMPAD4] = &m_nfour;
	keys[VK_NUMPAD5] = &m_nfive;
	keys[VK_NUMPAD6] = &m_nfix;
	keys[VK_NUMPAD1] = &m_none;
	keys[VK_NUMPAD2] = &m_ntwo;
	keys[VK_NUMPAD3] = &m_nthree;
	keys[VK_NUMPAD0] = &m_nzero;
	keys[VK_DECIMAL] = &m_ndot;
	keys2[VK_RETURN] = &m_nenter;	// 4
	keys[VK_ADD] = &m_nadd;

	// 多媒体键
	keys[0xAD] = &m_mute;
	keys[0xAE] = &m_vdown;
	keys[0xAF] = &m_vup;
	keys[0xB1] = &m_prev;
	keys[0xB3] = &m_pause;
	keys[0xB0] = &m_next;
	keys[0xFF] = &m_fn;

	keys[0xB5] = &m_music;
	keys[0xB2] = &m_stop;

	/* 修改字体大小和颜色 */
	// 静态框和顶层按钮
	CFont* pfont = GetDlgItem(IDC_STATIC_PASSED)->GetFont();
	pfont->GetLogFont(&logfont);
	logfont.lfHeight = logfont.lfHeight * 1.5;
	logfont.lfWidth  = logfont.lfWidth * 1.5;
	font.CreateFontIndirect(&logfont);
	GetDlgItem(IDC_STATIC_PASSED)->SetFont(&font);
	GetDlgItem(IDC_STATIC_CODE)->SetFont(&font);
	GetDlgItem(IDC_STATIC_KNAME)->SetFont(&font);
	GetDlgItem(IDC_BUTTON_CLEAR)->SetFont(&font);
	GetDlgItem(IDC_BUTTON_DONE)->SetFont(&font);
	GetDlgItem(IDC_BUTTON_CLEAR)->SetFont(&font);
	
	// 编辑框
	pfont = GetDlgItem(IDC_EDIT_KNAME)->GetFont();
	pfont->GetLogFont(&logfont);
	logfont.lfHeight =logfont.lfHeight * 2;
	logfont.lfWidth  = logfont.lfWidth * 2;
	font2.CreateFontIndirect(&logfont);
	GetDlgItem(IDC_EDIT_KNAME)->SetFont(&font2);

	pfont = GetDlgItem(IDC_EDIT_PASSED)->GetFont();
	pfont->GetLogFont(&logfont);
	logfont.lfHeight =logfont.lfHeight * 3;
	logfont.lfWidth  = logfont.lfWidth * 3;
	font3.CreateFontIndirect(&logfont);
	GetDlgItem(IDC_EDIT_PASSED)->SetFont(&font3);
	GetDlgItem(IDC_EDIT_CODE)->SetFont(&font3);

	// 所有按键初始化为白色
	pfont = GetDlgItem(IDC_EDIT_KNAME)->GetFont();
	pfont->GetLogFont(&logfont);
	logfont.lfHeight = logfont.lfHeight * 0.8;
	logfont.lfWidth  = logfont.lfWidth * 0.8;
	font4.CreateFontIndirect(&logfont);

	keys[0xFF]->SetFaceColor(clrLightGray);	// 特殊键Fn
	//keys[0xFF]->SetTextColor(RGB(0, 255, 255));
	keys[0xFF]->SetFont(&font4);
	for (int i = 0; i < 0xDF;   i)		
		if (keys[i])
		{
			keys[i]->SetFaceColor(clrLightGray);
			keys[i]->SetFont(&font4);
		}
	for (int i = 0x0D; i < 0x13;   i)	// rshift:10, rctrl:11, ralt:12, nenter:0D
		if (keys2[i])
		{
			keys2[i]->SetFaceColor(clrLightGray);
			keys2[i]->SetFont(&font4);
		}

	num = (CMFCButton*)GetDlgItem(IDC_RADIO_NUM);
	caps = (CMFCButton*)GetDlgItem(IDC_RADIO_CAPS);
	scroll = (CMFCButton*)GetDlgItem(IDC_RADIO_SCROLL);
	//num->SetFaceColor(RGB(0, 255, 0));

	// 设置指示灯
	::GetKeyboardState(KeyboardState);
	if (KeyboardState[VK_NUMLOCK] & 0x01)
		num->SetCheck(TRUE);
	else
		num->SetCheck(FALSE);
	if (KeyboardState[VK_CAPITAL] & 0x01)
		caps->SetCheck(TRUE);
	else
		caps->SetCheck(FALSE);
	if (KeyboardState[VK_SCROLL] & 0x01)
		scroll->SetCheck(TRUE);
	else
		scroll->SetCheck(FALSE);

	CRect rectWnd;
	GetWindowRect(&rectWnd);		//得到当前窗口(对话框)的坐标
	listRect.AddTail(&rectWnd);		//将坐标添加到链表listRect的末尾(注意是CList<CRect,CRect>listRect;类的成员变量)

	CWnd *pWndChild = GetWindow(GW_CHILD);
	while (pWndChild)	//依次得到对话框上控件的坐标,并将所有的控件坐标存储在链表中
	{
		if (pWndChild->GetDlgCtrlID() != IDC_BUTTON_CLEAR && pWndChild->GetDlgCtrlID() != IDC_BUTTON_DONE)
		{
			pWndChild->GetWindowRect(&rectWnd);
			listRect.AddTail(&rectWnd);		//由于依次将控件坐标添加到链表末尾,所以开头的坐标是对话框的坐标
		}
		pWndChild = pWndChild->GetNextWindow();
	}


	// 安装进程内鼠标钩子和全局键盘钩子
	g_hWnd = GetSafeHwnd();
	g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, NULL, GetCurrentThreadId());
	SetKeyFilter(g_hWnd);	// 安装键盘钩子

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CKeyTestDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon   1) / 2;
		int y = (rect.Height() - cyIcon   1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CKeyTestDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



BOOL CKeyTestDlg::PreTranslateMessage(MSG* pMsg)
{
	GetKeyboardState(KeyboardState);
	/*
	if (pMsg->lParam == 1)
	{
		GetKeyboardState(KeyboardState);
		KeyboardState[VK_NUMLOCK] |= 0x01;
		SetKeyboardState(KeyboardState);
	}
	*/
	// TODO: 在此添加专用代码和/或调用基类
	if( WM_KEYDOWN == pMsg->message || WM_SYSKEYDOWN== pMsg->message
		/*|| pMsg->wParam == 255 && ::GetKeyState(255)&0x80*/
		|| pMsg->wParam == VK_RETURN && ::GetKeyState(VK_RETURN)&0x80 
		|| pMsg->wParam == VK_SNAPSHOT && ::GetKeyState(VK_SNAPSHOT)&0x80
		/*::GetAsyncKeyState(VK_SNAPSHOT)&0x80 keyboardstate[VK_SNAPSHOT]&0x80*/)
	{
		GetKeyNameText(pMsg->lParam,szKeyName,sizeof (szKeyName) / sizeof (TCHAR));
		if (strlen(szKeyName) == 0)
			wsprintf(szKeyName, "%c", pMsg->wParam);
		SetDlgItemText(IDC_EDIT_KNAME,szKeyName);
		wsprintf(szBuffer,"%X",pMsg->wParam);
		SetDlgItemText(IDC_EDIT_CODE, szBuffer);

		std::string str(szKeyName, szKeyName   3);
		if ((str == "Num") && (szKeyName[4] >= '0' && szKeyName[4] <= '9' || szKeyName[4] == 'D') 
				&& (KeyboardState[VK_NUMLOCK]&0x01) == 0 && dwnflag == FALSE)
		{
			dwnflag = TRUE;
			if (szKeyName[4] == 'D')
				PostMessage(pMsg->message, VK_DECIMAL, pMsg->lParam);
			else
				PostMessage(pMsg->message, VK_NUMPAD0   int(szKeyName[4] - '0'), pMsg->lParam);
			/*
			switch (szKeyName[4])
			{
			case '0':
				PostMessage(pMsg->message, VK_NUMPAD0, pMsg->lParam);
				break;
			case '1':
				PostMessage(pMsg->message, VK_NUMPAD1, pMsg->lParam);
				break;
			case '2':
				PostMessage(pMsg->message, VK_NUMPAD2, pMsg->lParam);
				break;
			case '3':
				PostMessage(pMsg->message, VK_NUMPAD3, pMsg->lParam);
				break;
			case '4':
				PostMessage(pMsg->message, VK_NUMPAD4, pMsg->lParam);
				break;
			case '5':
				PostMessage(pMsg->message, VK_NUMPAD5, pMsg->lParam);
				break;
			case '6':
				PostMessage(pMsg->message, VK_NUMPAD6, pMsg->lParam);
				break;
			case '7':
				PostMessage(pMsg->message, VK_NUMPAD7, pMsg->lParam);
				break;
			case '8':
				PostMessage(pMsg->message, VK_NUMPAD8, pMsg->lParam);
				break;
			case '9':
				PostMessage(pMsg->message, VK_NUMPAD9, pMsg->lParam);
				break;
			case 'D':
				PostMessage(pMsg->message, VK_DECIMAL, pMsg->lParam);
				break;
			}
			*/
			return 1;
		}

		if (keys[pMsg->wParam])
		{		
			if ((pMsg->wParam == VK_SHIFT || pMsg->wParam == VK_CONTROL 
				|| pMsg->wParam == VK_MENU || pMsg->wParam == VK_RETURN) 
				&& strlen(szKeyName) > 5)
			{ // 同编码按键的处理:左右shift、ctrl、alt;两个回车;逗号与截屏
				keys2[pMsg->wParam]->SetFaceColor(lblue);
				keys2[pMsg->wParam]->SetState(TRUE);
				if (passed2[pMsg->wParam] == 0)
				{
					passed2[pMsg->wParam] = 1;
					  m_passed;
					UpdateData(FALSE);			
				}
			}
			else
			{
				if (dwnflag == TRUE) dwnflag = FALSE;
				//keys[nChar]->SetState(BST_CHECKED);
				keys[pMsg->wParam]->SetFaceColor(lblue);
				keys[pMsg->wParam]->SetState(TRUE);
				if (passed[pMsg->wParam] == 0)
				{
					passed[pMsg->wParam] = 1;
					  m_passed;
					UpdateData(FALSE);
				}
			}

			// Ctrl   C,重新测试
			if (::GetKeyState(VK_CONTROL)&0x80)
			{
				if (pMsg->wParam == VK_F4)
				{
					keys[VK_F4]->SetState(FALSE);
					keys[VK_CONTROL]->SetState(FALSE);

					keys[0xFF]->SetFaceColor(clrLightGray);	// 特殊键Fn
					passed[0xFF] = 0;
					for (int i = 0; i < 0xDF;   i)
						if (keys[i])
						{
							keys[i]->SetFaceColor(clrLightGray);
							passed[i] = 0;
						}
					for (int i = 0x0D; i < 0x13;   i)	// rshift:10, rctrl:11, ralt:12, nenter:0D
						if (keys2[i])
						{
							keys2[i]->SetFaceColor(clrLightGray);
							passed2[i] = 0;
						}
					m_passed = 0;
					UpdateData(FALSE);
				}
				/*
				if (pMsg->wParam == 'D' && m_passed < 113)
				{
					if (keys[0xFF] && passed[0xFF] == 0)
						keys[0xFF]->SetFaceColor(RGB(128, 0, 0));	// 特殊键Fn
					for (int i = 0; i < 0xDF;   i)
						if (keys[i] && passed[i] == 0)
							keys[i]->SetFaceColor(RGB(128, 0, 0));
					for (int i = 0x0D; i < 0x13;   i)	// rshift:10, rctrl:11, ralt:12, nenter:0D
						if (keys2[i] && passed2[i] == 0)
							keys2[i]->SetFaceColor(RGB(128, 0, 0));
				}
				*/
			}
		}

		// 设置指示灯
		::GetKeyboardState(KeyboardState);
		if (KeyboardState[VK_NUMLOCK] & 0x01)
			num->SetCheck(TRUE);
		else
			num->SetCheck(FALSE);
		if (KeyboardState[VK_CAPITAL] & 0x01)
			caps->SetCheck(TRUE);
		else
			caps->SetCheck(FALSE);
		if (KeyboardState[VK_SCROLL] & 0x01)
			scroll->SetCheck(TRUE);
		else
			scroll->SetCheck(FALSE);

		//if (::GetKeyState(VK_RETURN)&0x80 || ::GetKeyState(VK_SNAPSHOT)&0x80)
			return TRUE;	// 截取消息,按键不再咚咚响,光标在编辑框里时回车不再退出
	}

	if (WM_KEYUP == pMsg->message || WM_SYSKEYUP == pMsg->message
		|| pMsg->wParam == VK_RETURN && (::GetKeyState(VK_RETURN)&0x80) == 0
		|| pMsg->wParam == VK_SNAPSHOT && (::GetKeyState(VK_SNAPSHOT)&0x80) == 0)
	{
		GetKeyNameText(pMsg->lParam,szKeyName,sizeof (szKeyName) / sizeof (TCHAR));
		if (strlen(szKeyName) == 0)
			wsprintf(szKeyName, "%c", pMsg->wParam);
		SetDlgItemText(IDC_EDIT_KNAME,szKeyName);	
		wsprintf(szBuffer,"%X",pMsg->wParam);
		SetDlgItemText(IDC_EDIT_CODE, szBuffer);

		std::string str(szKeyName, szKeyName   3);
		if ((str == "Num") && (szKeyName[4] >= '0' && szKeyName[4] <= '9' || szKeyName[4] == 'D') 
			&& (KeyboardState[VK_NUMLOCK]&0x01) == 0 && upflag == FALSE)
		{
			upflag = TRUE;
			if (szKeyName[4] == 'D')
				PostMessage(pMsg->message, VK_DECIMAL, pMsg->lParam);
			else
				PostMessage(pMsg->message, VK_NUMPAD0   int(szKeyName[4] - '0'), pMsg->lParam);
			/*
			switch (szKeyName[4])
			{
			case '0':
				PostMessage(pMsg->message, VK_NUMPAD0, pMsg->lParam);
				break;
			case '1':
				PostMessage(pMsg->message, VK_NUMPAD1, pMsg->lParam);
				break;
			case '2':
				PostMessage(pMsg->message, VK_NUMPAD2, pMsg->lParam);
				break;
			case '3':
				PostMessage(pMsg->message, VK_NUMPAD3, pMsg->lParam);
				break;
			case '4':
				PostMessage(pMsg->message, VK_NUMPAD4, pMsg->lParam);
				break;
			case '5':
				PostMessage(pMsg->message, VK_NUMPAD5, pMsg->lParam);
				break;
			case '6':
				PostMessage(pMsg->message, VK_NUMPAD6, pMsg->lParam);
				break;
			case '7':
				PostMessage(pMsg->message, VK_NUMPAD7, pMsg->lParam);
				break;
			case '8':
				PostMessage(pMsg->message, VK_NUMPAD8, pMsg->lParam);
				break;
			case '9':
				PostMessage(pMsg->message, VK_NUMPAD9, pMsg->lParam);
				break;
			case 'D':
				PostMessage(pMsg->message, VK_DECIMAL, pMsg->lParam);
				break;
			}
			*/
			return 1;
		}

		if (keys[pMsg->wParam]&&passed[pMsg->wParam] || keys2[pMsg->wParam]&&passed2[pMsg->wParam])
		{
			if ((pMsg->wParam == VK_SHIFT || pMsg->wParam == VK_CONTROL 
				|| pMsg->wParam == VK_MENU || pMsg->wParam == VK_RETURN) 
				&& strlen(szKeyName) > 5)
			{
				keys2[pMsg->wParam]->SetFaceColor(lgreen);
				keys2[pMsg->wParam]->SetState(FALSE);
			}
			else
			{
				if (upflag == TRUE) upflag = FALSE;
				keys[pMsg->wParam]->SetFaceColor(lgreen);
				keys[pMsg->wParam]->SetState(FALSE);
			}
		}

		return TRUE;
	}

	return CDialogEx::PreTranslateMessage(pMsg);
}


void CKeyTestDlg::WinHelp(DWORD dwData, UINT nCmd)
{
	// TODO: 在此添加专用代码和/或调用基类
	if (nCmd) return ;		// 屏蔽F1弹出帮助

	CDialogEx::WinHelp(dwData, nCmd);
}

/*
// 测试完成,高亮标记未测试的按键
void CKeyTestDlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	
}
*/


void CKeyTestDlg::OnBnClickedButtonClear()
{
	// TODO: 在此添加控件通知处理程序代码
	//keys['C']->SetState(FALSE);
	//keys[VK_CONTROL]->SetState(FALSE);

	keys[0xFF]->SetFaceColor(clrLightGray);	// 特殊键Fn
	passed[0xFF] = 0;
	for (int i = 0; i < 0xDF;   i)
		if (keys[i])
		{
			keys[i]->SetFaceColor(clrLightGray);
			passed[i] = 0;
		}
	for (int i = 0x0D; i < 0x13;   i)	// rshift:10, rctrl:11, ralt:12, nenter:0D
		if (keys2[i])
		{
			keys2[i]->SetFaceColor(clrLightGray);
			passed2[i] = 0;
		}
	m_passed = 0;
	UpdateData(FALSE);
}


void CKeyTestDlg::OnBnClickedButtonDone()
{
	// TODO: 在此添加控件通知处理程序代码
	if (m_passed < 113)
	{
		if (keys[0xFF] && passed[0xFF] == 0)
			keys[0xFF]->SetFaceColor(RGB(128, 0, 0));	// 特殊键Fn
		for (int i = 0; i < 0xDF;   i)
			if (keys[i] && passed[i] == 0)
				keys[i]->SetFaceColor(RGB(128, 0, 0));
		for (int i = 0x0D; i < 0x13;   i)	// rshift:10, rctrl:11, ralt:12, nenter:0D
			if (keys2[i] && passed2[i] == 0)
				keys2[i]->SetFaceColor(RGB(128, 0, 0));
	}
}


LRESULT CKeyTestDlg::OnNcHitTest(CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	// 客户区模拟标题栏,可以拖动
	UINT nFlags = CDialogEx::OnNcHitTest(point);
	if (nFlags == HTCLIENT)
		return HTCAPTION;

	return CDialogEx::OnNcHitTest(point);
}


void CKeyTestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CDialogEx::OnLButtonDown(nFlags, point);
}


HBRUSH CKeyTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO:  在此更改 DC 的任何特性
	/* 不要判断nCtlColor变量,会带来莫名其妙的问题
	if (nCtlColor == CTLCOLOR_BTN && pWnd->GetDlgCtrlID() == IDC_BUTTON_CLEAR ||
		nCtlColor == CTLCOLOR_STATIC && pWnd->GetDlgCtrlID() == IDC_STATIC_PASSED ||
		nCtlColor == CTLCOLOR_EDIT && pWnd->GetDlgCtrlID() == IDC_EDIT_CODE)
	{
		pDC->SetTextColor(gb);
		//pDC->SetBkColor(RGB(255,255,0));	//设置文本背景色
		//pDC->SetBkMode(TRANSPARENT);		//设置背景透明
		//CBrush m_brush;
		//hbr = (HBRUSH)m_brush.CreateSolidBrush(gb);;	// 背景颜色
	}
	*/
	switch (pWnd->GetDlgCtrlID())
	{
		/*
	//case IDC_BUTTON_CLEAR:
	//case IDC_BUTTON_DONE:
	case IDC_STATIC_PASSED:
	case IDC_STATIC_CODE:
	case IDC_STATIC_KNAME:
	*/
	case IDC_STATIC_NUM:
	case IDC_STATIC_CAPS:
	case IDC_STATIC_SCROLL:
		pDC->SetTextColor(blue);
		break;
	case IDC_EDIT_PASSED:
	case IDC_EDIT_CODE:
	case IDC_EDIT_KNAME:
		pDC->SetTextColor(gb);
		break;
	}

	// TODO:  如果默认的不是所需画笔,则返回另一个画笔
	return hbr;
}


void CKeyTestDlg::OnSize(UINT nType, int cx, int cy)
{
	CDialogEx::OnSize(nType, cx, cy);

	// TODO: 在此处添加消息处理程序代码
	if (listRect.GetCount()>0)//看链表是否为空
	{
		CRect rectDlgNow;
		GetWindowRect(&rectDlgNow);//得到当前对话框的坐标
		POSITION mp=listRect.GetHeadPosition();//取得存储在链表中的头元素,其实就是前边的对话框坐标
		CRect rectDlgSaved;
		rectDlgSaved=listRect.GetNext(mp);
		ScreenToClient(rectDlgNow);
		float fRateScaleX=(float)(rectDlgNow.right-rectDlgNow.left)/(rectDlgSaved.right-rectDlgSaved.left);//拖拉后的窗口大小与原来窗口大小的比例
		float fRateScaleY=(float)(rectDlgNow.bottom-rectDlgNow.top)/(rectDlgSaved.bottom-rectDlgSaved.top);
		ClientToScreen(rectDlgNow);
		CRect rectChildSaved;
		CWnd *pWndChild=GetWindow(GW_CHILD);
		while (pWndChild)
		{
			if (pWndChild->GetDlgCtrlID() != IDC_BUTTON_CLEAR && pWndChild->GetDlgCtrlID() != IDC_BUTTON_DONE)
			{
				rectChildSaved=listRect.GetNext(mp);
				rectChildSaved.left=rectDlgNow.left (int)((rectChildSaved.left-rectDlgSaved.left)*fRateScaleX);
				rectChildSaved.top=rectDlgNow.top (int)((rectChildSaved.top-rectDlgSaved.top)*fRateScaleY);
				rectChildSaved.right=rectDlgNow.right (int)((rectChildSaved.right-rectDlgSaved.right)*fRateScaleX);
				rectChildSaved.bottom=rectDlgNow.bottom (int)((rectChildSaved.bottom-rectDlgSaved.bottom)*fRateScaleY);
				ScreenToClient(rectChildSaved);
				pWndChild->MoveWindow(rectChildSaved);
			}
			pWndChild = pWndChild->GetNextWindow();
		}
	}
	Invalidate(); //强制重绘窗口
}


标签: 键盘 测试

实例下载地址

c++ 键盘测试程序源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警