基本信息
源码名称:c++ 键盘测试程序源码下载
源码大小:0.96M
文件格式:.zip
开发语言:C/C++
更新时间:2016-11-18
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在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(); //强制重绘窗口
}