📄 keyboarddlg.cpp
字号:
// keyboardDlg.cpp : implementation file
//
#include "stdafx.h"
#include "keyboard.h"
#include "keyboardDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define HIGHLIGHTTEXTCOLOR RGB(255,200,0)
/////////////////////////////////////////////////////////////////////////////
// CKeyboardDlg dialog
CKeyboardDlg::CKeyboardDlg(CWnd* pParent /*=NULL*/)
: CDialog(CKeyboardDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CKeyboardDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CKeyboardDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CKeyboardDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CKeyboardDlg, CDialog)
//{{AFX_MSG_MAP(CKeyboardDlg)
ON_WM_PAINT()
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_VKEYTOITEM()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CKeyboardDlg message handlers
BOOL CKeyboardDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
LOGFONT temp;
memset(&temp, 0, sizeof(LOGFONT)); // zero out structure
temp.lfHeight = 12; // request a 12-pixel-height font
temp.lfWeight = 800;
strcpy((char *)temp.lfFaceName, "Arial"); // request a face name "Arial"
VERIFY(m_TextFont.CreateFontIndirect(&temp)); // create the font
FillBkBrushColor();
gFocus = NULL;
AddKey(0x00,0x00,0); //signal row change
AddKey('g','G',60);
AddKey('m','M',60);
AddKey('f','F',60);
AddKey('d','D',60);
AddKey('h','H',60);
AddKey('r','R',-60);
//first row
AddKey(0x00,0x00,1); //signal row change
AddKey('x','X',60);
AddKey('y','Y',60);
AddKey('z','Z',60);
AddKey('i','I',60);
AddKey('j','J',60);
AddKey('k','K',-60);
//second row
AddKey(0x00,0x00,2); //signal row change
AddKey('u','U',60);
AddKey('v','V',60);
AddKey('w','W',60);
AddKey('s','S',60);
AddKey('t','T',60);
AddKey('n','N',-60);
//third row
AddKey(0x00,0x00,3); //signal row change
AddKey('a','A',60);
AddKey('b','B',60);
AddKey('c','C',60);
AddKey('e','E',60);
AddKey('l','L',60);
AddKey('o','O',-60);
//fourth row
AddKey(0x00,0x00,4); //signal row change
AddKey('7','&',60);
AddKey('8','*',60);
AddKey('9','(',60);
AddKey('/','?',60);
AddKey('p','P',60);
AddKey('q','Q',-60);
//fifth row
AddKey(0x00,0x00,5); //signal row change
AddKey('4','$',60);
AddKey('5','%',60);
AddKey('6','^',60);
AddKey('\\','\"',60);
AddKey(0x00,DEL,60);
AddKey(0x00,BSPACE,-74); //backspace
//sixth row
AddKey(0x00,0x00,6);//
AddKey('1','!',55);
AddKey('2','@',55);
AddKey('3','#',55);
AddKey('=','+',55);
AddKey(0x00,CAPSLOCK,68); //caps lock
AddKey(0x00,SHIFT,-68); //shift
//seventh row
AddKey(0x00, 0x00, 7); //
AddKey('0',')',60);
AddKey('.','>',60);
AddKey('-','_',60);
AddKey(0x00, SPACE, 86);
//AddKey(' ',' ',86);
AddKey(0x00,ENTER,-66); //enter
CalcWidthHeight(); //计算窗口中按键大小
CalKeyRect(); //保存每一个按键的位置
SetWindowPos(&wndTopMost, 0, 0, 0, 0, //把窗口放到最顶端
SWP_NOSIZE | SWP_NOMOVE);
::SetProp(m_hWnd, AfxGetApp()->m_pszExeName, (HANDLE)1);
return TRUE; // return TRUE unless you set the focus to a control
}
//********************************************************
// 函数功能 :当窗口切换的时候,保存当前键盘输入焦点窗口句柄
// 入口参数 :
//
// 返回参数 :
//
// 创建日期 :
// 作者
//********************************************************
BOOL CKeyboardDlg::PreTranslateMessage(MSG* pMsg)
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd != this->m_hWnd)
{
if(gFocus != wnd)
{
/*if(IsWindow(gFocus))
{
AttachThreadInput(
GetCurrentThreadId(),
GetWindowThreadProcessId(gFocus,NULL),
FALSE);
}*/
gFocus = wnd;
/*AttachThreadInput(
GetCurrentThreadId(),
GetWindowThreadProcessId(gFocus,NULL),
TRUE);*/
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CKeyboardDlg::ReleaseFocus()
{
if(IsWindow(gFocus))
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd == gFocus)
{
return;
}
}
::SetForegroundWindow(gFocus);
}
}
void CKeyboardDlg::AddKey(char pNormal, char pShifted, int pWidth)
{
KEYDEF * key = new KEYDEF;
key->cNormal = pNormal;
key->cShifted = pShifted;
key->cWidth = pWidth;
key->bHighlight=false;
cKeys.AddTail(key);
}
void CKeyboardDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
CDialog::OnSysCommand(nID, lParam);
}
void CKeyboardDlg::CalcWidthHeight()
{
pKeyWidth = 0;
pKeyHeight = 0;
KEYDEF * key;
POSITION pos = cKeys.GetHeadPosition();
long totalWidth = 0;
long longest = 0;
long rows = 0;
while(pos)
{
key = cKeys.GetNext(pos);
if((key->cNormal == 0x00) && (key->cShifted == 0x00))
{
rows++;
if(totalWidth > longest)
{
longest = totalWidth;
}
totalWidth = 0;
}
else
{
totalWidth += abs(key->cWidth);
}
}
CRect rect;
GetClientRect(rect);
pKeyHeight = rect.Height() / rows;
pKeyWidth = (int)(((double)rect.Width()) / ((((double)(longest)) / 12)));
}
void CKeyboardDlg::DrawKey(CDC *dc, KEYDEF *key)
{
CString label = " ";
BOOL special = FALSE;
CRect rc = key->rect;
if(key->cNormal==0x00 && key->cShifted==0x00)
return ;
COLORREF OldColor = dc->GetTextColor() ;
CPen Pen, TextPen;
CPen *pOldPen = NULL ;
if(!key->bHighlight) //没有高亮显示
{
rc.DeflateRect(1,1);
DoGradientFill(dc,&rc);
// dc->FillSolidRect(rc,GetSysColor(COLOR_3DFACE));
dc->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
rc.DeflateRect(1,1);
dc->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
}
else
{
rc.DeflateRect(1,1);
dc->FillSolidRect(rc,RGB(0x20,0xff,0x99)); //鼠标在上面的时候填充颜色
dc->Draw3dRect(rc,GetSysColor(COLOR_3DLIGHT),GetSysColor(COLOR_3DSHADOW));
rc.DeflateRect(1,1);
dc->Draw3dRect(rc,GetSysColor(COLOR_3DSHADOW),GetSysColor(COLOR_3DDKSHADOW));
dc->SetTextColor(HIGHLIGHTTEXTCOLOR) ;
Pen.CreatePen(PS_SOLID,1,HIGHLIGHTTEXTCOLOR) ;
pOldPen = dc->SelectObject(&Pen) ;
}
rc.DeflateRect(3,1);
CFont *pOldFont=dc->SelectObject(&m_TextFont); //按键的字体颜色和大小
dc->SetTextColor(RGB(0x88,0x22,0x11));
if(key->cNormal == 0x00)
{
switch(key->cShifted)
{
case CAPSLOCK: // 0x03
label = "Caps";
break;
case SHIFT: // 0x04
label = "Shift";
break;
case BSPACE: // 0x06
label = "Bspc";
break;
case ENTER: // 0x07
label = "Enter";
break;
case DEL: //0x14
label = "Del";
break;
case SPACE: //0x15
label = "Space";
break;
default:
ASSERT(FALSE);
label = "#ERR#";
break;
}
if(!special)
{
CSize tsize;
tsize = dc->GetTextExtent(label);
dc->ExtTextOut(
((rc.left + rc.right)/2) - (tsize.cx/2),
((rc.top + rc.bottom)/2) - (tsize.cy/2),
ETO_OPAQUE,
NULL,
label,
NULL);
}
}
else
{
if((key->cShifted >= 'A') && (key->cShifted <= 'Z'))
{
CSize tsize;
label.Format(_T("%c"),key->cShifted);
tsize = dc->GetTextExtent(label);
dc->ExtTextOut(
((rc.left + rc.right)/2) - (tsize.cx/2),
((rc.top + rc.bottom)/2) - (tsize.cy/2),
ETO_OPAQUE,
NULL,
label,
NULL);
}
else
{
CSize tsize;
tsize = dc->GetTextExtent("M");
label.Format(_T("%c"),key->cShifted);
dc->ExtTextOut(rc.left, rc.top, ETO_OPAQUE,
NULL,label,NULL);
label.Format(_T("%c"),key->cNormal);
dc->ExtTextOut(
rc.right - tsize.cx,
rc.bottom - tsize.cy,
ETO_OPAQUE,
NULL,
label,
NULL);
}
}
dc->SetTextColor(OldColor);
dc->SelectObject(pOldFont);
if(pOldPen)
dc->SelectObject(pOldPen) ;
}
//********************************************************
// 函数功能 :把按键发内容送到指定窗口中去
// 入口参数 :
//
// 返回参数 :
//
// 创建日期 :
// 作者 :丁继泉
//********************************************************
void CKeyboardDlg::SendKey(KEYDEF *keydef)
{
if(keydef->cNormal == 0x00)
{
int vk;
BOOL uptoo = TRUE;
if(keydef->cShifted > 0x6F) //is a function key
{
vk = keydef->cShifted;
}
else
{
switch(keydef->cShifted) //判断功能键的类型
{
case CAPSLOCK: // 0x03
vk = VK_CAPITAL;
break;
case SHIFT: // 0x04
vk = VK_SHIFT;
if(GetKeyState(vk) & 0xF000) //shift 已经按下
{
vk = VK_CONTROL;
if(GetKeyState(vk) & 0xF000) //ctrl 也按下
{
vk = VK_SHIFT;
keybd_event(vk,0,0,0);
}
vk = VK_SHIFT;
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
return;
}
uptoo = FALSE; //保存shift状态
break;
case CTRL: // 0x05
vk = VK_CONTROL;
if(GetKeyState(vk) & 0xF000) //ctrl已经按下
{
vk = VK_SHIFT;
if(GetKeyState(vk) & 0xF000) //shift 也按下
{
vk = VK_CONTROL;
keybd_event(vk,0,0,0);
}
vk = VK_CONTROL;
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
return;
}
uptoo = FALSE; //保存ctrl状态
break;
case BSPACE: // 0x06
vk = VK_BACK;
break;
case ENTER: // 0x07
vk = VK_RETURN & 0xFF;
break;
case DEL: //0x14
vk = VK_DELETE;
break;
case SPACE: //0x15
vk = VK_SPACE;
break;
default:
ASSERT(FALSE);
break;
}
}
keybd_event(vk,0,0,0);
if(uptoo)
{
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
}
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -