鍓嶄簺澶╄姳浜嗗緢澶氭椂闂村啓榪欐牱涓涓蔣閿洏錛屾晥鏋滄槸鏄劇ず涓涓笌閿洏澶栬鐩鎬技鐨勮鍥撅紝閫氳繃榧犳爣鍗曞嚮鍍忔椿鍔ㄧ獥鍙e彂閫佽櫄鎷熺殑閿洏娑堟伅銆傜洰鏍囨槸瀹炵幇鍍弚indows鑷甫鐨勮蔣閿洏osk鐩鎬技銆?br> 鐪嬩技寰堢畝鍗曠殑宸ヤ綔錛岃璁′腑鍗撮亣鍒頒簡寰堝鍥伴毦銆?br> 鍥伴毦涓錛氶敭鐩樻寜閿垎綾?br> 閿洏鎸夐敭鏈夊緢澶氱鍒嗙被鏂規硶銆?br> 絎竴縐嶏細鎸夋樉紺哄垎綾匯傛寜浣弒hift閿紝瀛楁瘝閿佺鍙烽敭鏄劇ず涓婇潰鐨勫瓧絎︼紱鎸変笅caps lock閿紝瀛楁瘝閿垏鎹負澶у啓瀛楁瘝銆?br> 絎簩縐嶏細鎸夊姛鑳藉垎綾匯傚ぇ浣撴湁鍙樉紺哄瓧絎︾被銆佹帶鍒剁被銆傛帶鍒剁被鍖呮嫭shift錛宑trl絳夈?br> 涓轟簡瑙e喅鍙彉鐨勬樉紺洪棶棰橈紝閲囩敤浜嗕竴涓嚜鎴戞劅瑙夐潪甯稿ソ鐨勮В鍐蟲柟妗堬細瀛楃闆嗐侀敭闆嗙浉浜掔嫭绔嬨傚姝や竴鏉ワ紝鍙鎬諱綋鎸夌収鍔熻兘鍒嗙被錛岄氳繃鐗瑰畾鍔熻兘鐨勬寜閿帶鍒舵湁鏁堝瓧絎﹂泦鍗沖彲錛屼篃灝辨槸璇達紝瀵規櫘閫氭寜閿潵璇達紝瀹冨彧璐熻矗鍒版寚瀹氱殑瀛楃闆嗕腑鍘誨彇瀵瑰簲搴忓彿鐨勫瓧絎﹀嵆鍙?br>
//LabelSet.h
#pragma once
//瀛楁瘝鏍囩闆嗗悎
class LabelSet
{
public:
LabelSet(LPCSTR* _pTable,int _n);
LPCSTR getLabel(int _id) const;
~LabelSet();
protected:
LabelSet(){}
private:
LPCSTR* pTable;
int n;
};
//鐩稿綋浜庡崟鍒鍙屾幏寮鍏崇粍
class LabelSetEx
{
protected:
struct Switch
{
LabelSet* s[2];
int at;
};
public:
LabelSetEx(int _n);
bool addSets(int id,LPCSTR* s1,LPCSTR* s2,int n,int at = 0);
LPCSTR getLable(int id,int off) const;
void turn(int id);
~LabelSetEx();
private:
int n; //寮鍏崇粍鎬諱釜鏁?/span>
Switch* pGroup; //寮鍏崇粍
};
//
//LabelSet.cpp
#include "StdAfx.h"
#include "LabelSet.h"
#include <algorithm>
#include <cassert>
using namespace std;
LabelSet::LabelSet( LPCSTR* _pTable,int _n )
{
n = _n;
pTable = new LPCSTR[n];
copy(_pTable,_pTable + _n,pTable);
}
LPCSTR LabelSet::getLabel( int _id ) const
{
return pTable[_id];
}
LabelSet::~LabelSet()
{
delete [] pTable;
}
LabelSetEx::LabelSetEx( int _n )
{
n = _n;
pGroup = new Switch[n];
memset(pGroup,0,n * sizeof(pGroup[0]));
}
LabelSetEx::~LabelSetEx()
{
while(n--)
{
if(pGroup[n].s[0] == pGroup[n].s[1])
delete pGroup[n].s[0];
else
{
delete pGroup[n].s[0];
delete pGroup[n].s[1];
}
}
delete [] pGroup;
}
bool LabelSetEx::addSets( int id,LPCSTR* s1,LPCSTR* s2,int n,int at /*= 0*/ )
{
assert((at & ~1) == 0);
if(pGroup[id].s[0] != NULL)
return false;
LabelSet* p = new LabelSet(s1,n);
pGroup[id].s[0] = p;
if(s1 == s2)
pGroup[id].s[1] = p;
else
pGroup[id].s[1] = new LabelSet(s2,n);
pGroup[id].at = at;
return true;
}
LPCSTR LabelSetEx::getLable( int id,int off ) const
{
Switch* p = pGroup + id;
return p->s[p->at]->getLabel(off);
}
void LabelSetEx::turn( int id )
{
assert((pGroup->at & ~1) == 0);
pGroup[id].at ^= 1;
}
浠ヤ笂鍙栧紑鍏崇殑绱㈠紩id鏄寚瀛楃闆嗙殑鍒嗙被id錛屽湪config.h鏂囦歡涓嬪畾涔変簡榪欐牱鐨刬d
#pragma once
//鍒嗙被id鐨勫畾涔?/span>
#define LABEL_SET_ALPHA 0
#define LABEL_SET_SYMBOL 1
#define LABEL_SET_NUMPAD 2
#define LABEL_SET_MAIN 3
#define LABEL_SET_HELP 4
//瀛楁瘝涓茶〃
extern LPCSTR AlphaTable1[]; //灝忓啓
extern LPCSTR AlphaTable2[]; //澶у啓
extern const int AlphaTableSize;
//絎﹀彿涓茶〃
extern LPCSTR SymbolTable1[]; //涓?/span>
extern LPCSTR SymbolTable2[]; //涓?/span>
extern const int SymbolTableSize;
//灝忛敭鐩樻暟瀛楄〃
extern LPCSTR NumPadTable1[]; //鏁板瓧
extern LPCSTR NumPadTable2[]; //鍏夋爣鎺у埗
extern const int NumPadTableSize;
//涓婚敭鐩樺崟鏄?/span>
extern LPCSTR MainTable[];
extern const int MainTableSize;
//杈呭姪閿洏鍗曟樉
extern LPCSTR HelpTable[];
extern const int HelpTableSize;
struct KeyConfig
{
short id; //鍒嗙被id
short offset; //綾誨唴鍋忕Щ
RECT rt; //浣嶇疆
BYTE vk; //铏氭嫙鐮?/span>
};
extern KeyConfig kcs[];
extern const int kcSize;
extern const SIZE kbSize;
絎竴嬈¤繖鏍峰啓浠g爜錛屽啓瀹屽彂鐜拌繖鏍鋒瀬澶у湴鎻愰珮浜嗙伒媧繪э紝鍙鍦ㄩ厤緗枃浠禼onfig.cpp涓慨鏀癸紝灝卞彲浠ヤ駭鐢熷緢澶氱涓嶅悓鐨勭晫闈紙铏界劧浠嶇劧鏄唬鐮佺駭鍒殑錛屾瘯绔熻繄鍑轟簡絎竴姝ワ紝浠婂悗榪樹細灝濊瘯鏀規垚xml閰嶇疆錛夈?br> 璦褰掓浼狅紝榪欐牱鐨勮璁″垎紱諱簡鎸夐敭涓庢樉紺猴紝鍙厤緗兘鍔涘ぇ澶у姞寮恒備絾浠嶇劧瀛樺湪絎簩涓ぇ闂銆?br> 闂浜岋細杈撳叆鐒︾偣鐨勭‘瀹?br> 鏂規涓錛氱幇鍦ㄥ彧瑕佸湪緗戜笂鎼滅儲“铏氭嫙閿洏”錛岃兘澶熸悳鍒頒竴澶ф簻鐨勬簮浠g爜錛屼絾鍙彲鎯滃叏鏄悓涓浠芥嫹璐濓紝鑰屼笖瀛樺湪涓鐐瑰皬閿欒銆備粬鐨勮В鍐蟲柟妗堟槸錛氬埄鐢?PreTranslateMessage錛屽湪搴曞眰璋冪敤瀹冧箣鍓嶏紝鍓嶅彴紿楀彛浠嶇劧娌℃湁鏀瑰彉錛屾鏃舵槸鑾峰緱鍓嶄竴涓墠鍙扮獥鍙g殑濂芥椂鏈猴紝鑾峰緱鍚庝繚瀛橈紝騫跺皢浣跨敤 AttachThreadInput灝嗗綋鍓嶇嚎紼嬬粦瀹氭椿鍔ㄧ獥鍙g殑娑堟伅闃熷垪錛岀劧鍚庡湪鍗曞嚮铏氭嫙閿洏鏃朵嬌鐢⊿etFocus灝嗕繚瀛樼殑紿楀彛璁句負鐒︾偣錛堟簮浠g爜涓悓鏃朵嬌鐢ㄤ簡SetForgroundWindow鍜孲etFocus錛岃繖鏄け鏁堢殑鍘熷洜錛夛紝鐒跺悗鍙戦佽櫄鎷熸寜閿?br>
鏂規浜岋細鍏跺疄鏈夋洿綆渚跨殑鏂規硶銆傝緗富紿楀彛灞炴т負WM_ES_NOACTIVATE錛岃繖鏍風獥鍙e氨涓嶄細鎴愪負鍓嶅彴紿楀彛錛屼笉綆″浣曞彂閫侀敭鐩樻秷鎭紝鎷ユ湁鐒︾偣鐨勭獥鍙f諱細鏀跺埌銆備絾姝ゆ椂浠嶇劧瀛樺湪闂銆傚綋縐誨姩紿楀彛鏃訛紝鏁堟灉涓嶅ぇ欏虹晠錛岃屼笖娌″姙娉曞搷搴旇彍鍗曞懡浠わ紝閭f槸鍥犱負璇ョ獥鍙e緇堜笉鏄墠鍙扮獥鍙i犳垚鐨勩傝В鍐蟲柟娉曞氨鏄湪鍗曞嚮鏍囬鏍忔椂錛屾垚涓哄墠鍙扮獥鍙o紝閲婃斁鏄綊榪樺墠鍙般?br>
void CMainFrame::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if(m_hForground == NULL)
{
m_hForground = ::GetForegroundWindow();
ModifyStyleEx(WS_EX_NOACTIVATE,0);
SetForegroundWindow();
}
CFrameWnd::OnNcLButtonDown(nHitTest, point);
}
浣嗘槸錛屽鏋滄兂褰撶劧褰掕繕鍓嶅彴浣跨敤WM_NCLBUTTONUP娑堟伅鐨勮瘽錛屽氨瑕佽浣犲け鏈涗簡錛寃indows浼間箮鏈夋剰璺熸垜浠紑鐜╃瑧錛屽繀欏誨崟鍑諱袱嬈℃墠鑳藉搷搴旇繖涓秷鎭傛病鍔炴硶錛屼簬鏄皾璇昗M_NCMOUSELEAVE錛屼絾鏁堟灉涔熶笉濂斤紝鏈緇堝皾璇昗M_NCMOUSEMOVE錛屽緢濂斤紝榪欐緇堜簬鎴愬姛浜嗐?br>
void CMainFrame::OnNcMouseMove(UINT nHitTest, CPoint point)
{
if(m_hForground != NULL)
{
::SetForegroundWindow(m_hForground);
ModifyStyleEx(0,WS_EX_NOACTIVATE);
m_hForground = NULL;
}
CFrameWnd::OnNcMouseMove(nHitTest, point);
}
闂鍒版涓烘錛岀幇鍦ㄨ璇翠竴鐐瑰皬灝忕殑鍙戠幇銆?br> 鍘熸湰浠ヤ負涓鑸殑鎸夐敭灝變袱縐嶇姸鎬侊紝閫氳繃down銆乽p鏀瑰彉錛屽鏋滅敤鏂規嘗鎻忚堪錛宒own灝辨槸涓嬮檷娌胯Е鍙戯紝up鏄笂鍗囨部瑙﹀彂銆備篃鏇句簡瑙o紝鍍弒hift榪欐牱鐨勬寜閿細寰堝鏉傦紝瀛樺湪澶氫釜鐘舵併傚悗鏉ユ祴璇曞彂鐜幫紝shift騫墮潪涓涓壒渚嬶紝鎵鏈夌殑鎸夐敭閮芥湁4涓姸鎬侊紝閫氳繃down銆乽p鏀瑰彉鐘舵併傚彧鏄笉鍚屾寜閿鐘舵佺殑鍏蟲敞鐐逛笉鍚屻?br> 鍙互鍋氳繖鏍蜂竴涓祴璇曪紝鐢℅etKeyboardState寰楀埌鍚勪釜铏氭嫙鐮佸搴旂殑鎸夐敭鐘舵併傛渶楂樹綅涓?鏃惰〃紺洪敭琚寜涓嬶紝鏈楂樹綅涓?鏃訛紝濡傛灉鏄痩ock閿垯琛ㄧず琚攣浣忥紝瀵逛簬鍏朵粬閿紝鍚勬湁鍚勭殑浣滅敤銆?br> 姣斿涓涓敭錛岀敤2浣嶇殑浜岃繘鍒舵暟琛ㄧず榪欎簺鐘舵侊紝璁懼垵濮嬬姸鎬佷負10錛岀粡榪嘾own鍚庯紝鍙樹負01錛岀粡榪噓p鍚庯紝鍙樹負11,鍐嶇粡榪嘾own鍚庯紝鍙樹負00錛屽啀緇忚繃up鍚庯紝鍙樹負10錛屽姝ゅ洓涓姸鎬佺粡榪嘾own銆乽p瀹炵幇浜嗗懆鏈熸х殑鐘舵佽鎹€傚ぇ浣撶鍚堣繖鏍風殑瑙勫緥錛?br> 10-(down xor 11)->01->(up xor 10)->11-(down xor 11)->00(up xor 10)->10銆?br> 榪欐牱錛屽鏋滆櫄鎷熷緱姣旇緝褰誨簳錛屽湪铏氭嫙閿洏鍐呴儴鍙互杞繪槗鍦板疄鐜扮姸鎬佺殑璁板繂錛屽茍涓斿彲浠ヨ幏寰楄凍澶熺殑淇℃伅銆傚浜庢樉紺恒佹帶鍒墮兘闈炲父鏂逛究銆?br>
榪欏彧鏄涓涓増鏈紝榪樻湁寰堝闂闇瑕佽В鍐熾?br> 寰呰В鍐抽棶棰樹竴錛歺ml閰嶇疆鍔ㄦ侀厤緗敭鐩橈紝鍙婂姩鎬佹洿鎹㈡樉紺烘晥鏋溿?br> 寰呰В鍐抽棶棰樹簩錛氬悓姝ョ墿鐞嗛敭鐩樸?br> 寰呰В鍐抽棶棰樹笁錛氭洿娣卞眰嬈★紝闃叉閿洏娑堟伅琚玥ook錛屽垵姝ヨ璇嗭紝浼間箮鍙互浣跨敤鍓創鏉褲?br> 銆愭簮浠g爜1.2鐗堟湰錛?a href="http://www.shnenglu.com/Files/yefeng/VirtualKeyboard1.2.rar">http://www.shnenglu.com/Files/yefeng/VirtualKeyboard1.2.rar銆?/span>