屏幕键盘的问题。输入英文字还可以,在打开输入法的时候,就有问题了
解决方案 »
- 不晓得哪里有问题,迷茫了。。。。
- ActiveX注册失败后自动删除盘上的文件
- OnInitDialog函数中是否可以对类的指针成员变量分配内存?
- 如何使EDIT控件中的内容换行?
- 请教有关用ado对sql server数据库的添加、删除、查询操作。
- CSDNDownLoad - 可快速下载CSDN的贴子和文档
- 用StretchBlt将图片缩小显示的问题
- 请问脚本语言是如何编程的,
- 我现在希望屏蔽掉一些系统键,已经用低级键盘钩子函数成功屏蔽掉ALT+TAB、ALT+ESC、PrintScreen,却无法屏蔽ALT+CTRL+DEL和CTRL+PAUSE,请问是什么原因,并给一个解决方法?马上给分
- VC如何调用.CHM的帮助文件?
- 根据进程名怎样得到进程句柄?
- CString类型是只在vc里才有吗?
{
if(IsWindow(gFocus))
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd == gFocus)
{
return;
}
}
::SetForegroundWindow(gFocus);
::SetFocus(gFocus);
}
}
BOOL COnscreenKeyboardDlg::PreTranslateMessage(MSG* pMsg)
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd != this->m_hWnd)
{
if(gFocus != wnd)
{
if(IsWindow(gFocus))
{
AttachThreadInput(
GetWindowThreadProcessId(m_hWnd,NULL),
GetWindowThreadProcessId(gFocus,NULL),
FALSE);
} gFocus = wnd;
AttachThreadInput(
GetWindowThreadProcessId(m_hWnd,NULL),
GetWindowThreadProcessId(gFocus,NULL),
TRUE);
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
BOOL COnscreenKeyboardDlg::OnInitDialog()
{
//build the keyboard definition //control row
AddKey(0x00,0x00,0); //signal row change
AddKey(0x00,ESC,10);
for(int fnkey = 0x70; fnkey < 0x7C; fnkey++)
{
AddKey(0x00,fnkey & 0xFF,10);
}
AddKey(0x00,INS,14);
AddKey(0x00,DEL,-10); //first row
AddKey(0x00,0x00,1); //signal row change
AddKey('`','~',10);
AddKey('1','!',10);
AddKey('2','@',10);
AddKey('3','#',10);
AddKey('4','$',10);
AddKey('5','%',10);
AddKey('6','^',10);
AddKey('7','&',10);
AddKey('8','*',10);
AddKey('9','(',10);
AddKey('0',')',10);
AddKey('-','_',10);
AddKey('=','+',10);
AddKey(0x00,BSPACE,14); //backspace
AddKey(0x00,PUP,-12); //second row
AddKey(0x00,0x00,2); //signal row change
AddKey(0x00,TAB,14); //tab
AddKey('q','Q',10);
AddKey('w','W',10);
AddKey('e','E',10);
AddKey('r','R',10);
AddKey('t','T',10);
AddKey('y','Y',10);
AddKey('u','U',10);
AddKey('i','I',10);
AddKey('o','O',10);
AddKey('p','P',10);
AddKey('[','{',10);
AddKey(']','}',10);
AddKey('\\','|',10);
AddKey(0x00,PDN,-12); //third row
AddKey(0x00,0x00,3); //signal row change
AddKey(0x00,CAPSLOCK,18); //caps lock
AddKey('a','A',10);
AddKey('s','S',10);
AddKey('d','D',10);
AddKey('f','F',10);
AddKey('g','G',10);
AddKey('h','H',10);
AddKey('j','J',10);
AddKey('k','K',10);
AddKey('l','L',10);
AddKey(';',':',10);
AddKey('\'','\"',10);
AddKey(0x00,ENTER,16); //enter
AddKey(0x00,HOME,-10); //fourth row
AddKey(0x00,0x00,4); //signal row change
AddKey(0x00,SHIFT,22); //shift
AddKey('z','Z',10);
AddKey('x','X',10);
AddKey('c','C',10);
AddKey('v','V',10);
AddKey('b','B',10);
AddKey('n','N',10);
AddKey('m','M',10);
AddKey(',','<',10);
AddKey('.','>',10);
AddKey('/','?',10);
AddKey(0x00,SHIFT,22); //shift
AddKey(0x00,END,-10); //fifth row
AddKey(0x00,0x00,5); //signal row change
AddKey(0x00,CTRL,12); //ctrl
AddKey(0x00,WINDOW,12); //window
AddKey(0x00,ALT,12); //alt
AddKey(' ',' ',60);
AddKey(0x00,LEFT,12); //left
AddKey(0x00,UP,12); //up
AddKey(0x00,DOWN,12); //down
AddKey(0x00,RIGHT,12); //right
AddKey(0x00,WWW,-10); //http://WWW CalcWidthHeight(); SetTimer(TIMER_ID,250,NULL); return TRUE; // return TRUE unless you set the focus to a control
}void COnscreenKeyboardDlg::CalcWidthHeight()
{
//计算键盘大小
}void COnscreenKeyboardDlg::AddKey(
char pNormal,
char pShifted,
int pWidth)
{
KEYDEF * key = new KEYDEF;
key->cNormal = pNormal;
key->cShifted = pShifted;
key->cWidth = pWidth;
cKeys.AddTail(key);
}void COnscreenKeyboardDlg::DrawKey(CDC * dc, CRect & rc, KEYDEF * key, BOOL cHilight)
{
//画没一个键
}void COnscreenKeyboardDlg::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 TAB: // 0x02
vk = VkKeyScan(0x09) & 0xFF;
break;
case CAPSLOCK: // 0x03
vk = VK_CAPITAL;
break;
case SHIFT: // 0x04
vk = VK_SHIFT;
if(GetKeyState(vk) & 0xF000) return;
uptoo = FALSE;
break;
case CTRL: // 0x05
vk = VK_CONTROL;
if(GetKeyState(vk) & 0xF000) return;
uptoo = FALSE;
break;
case BSPACE: // 0x06
vk = VK_BACK;
break;
case ENTER: // 0x07
vk = VkKeyScan(0x0D) & 0xFF;
break;
case ALT: // 0x08
vk = VK_MENU;
break;
case WINDOW: // 0x9
vk = VK_LWIN;
break;
case LEFT: // 0x0A
vk = VK_LEFT;
break;
case RIGHT: // 0x0B
vk = VK_RIGHT;
break;
case UP: // 0x0C
vk = VK_UP;
break;
case DOWN: // 0x0D
vk = VK_DOWN;
break;
case PUP: //0x0F
vk = VK_PRIOR;
break;
case PDN: //0x10
vk = VK_NEXT;
break;
case HOME: //0x11
vk = VK_HOME;
break;
case END: //0x12
vk = VK_END;
break;
case INS: //0x13
vk = VK_INSERT;
break;
case DEL: //0x14
vk = VK_DELETE;
break;
case WWW:
break;
default:
ASSERT(FALSE);
break;
}
}
keybd_event(vk,0,0,0);
if(uptoo)
{
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
}
}
else
{
char pChar = keydef->cNormal;
SHORT ks = VkKeyScan(pChar);
BYTE key = ks & 0xFF; keybd_event(key,0,0,0);
keybd_event(key,0,KEYEVENTF_KEYUP,0); //turn off the control and shift if they were down
unsigned char vk = VK_SHIFT;
if(GetKeyState(vk) & 0xF000)
{
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
}
vk = VK_CONTROL;
if(GetKeyState(vk) & 0xF000) //allow toggle
{
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
}
}
}void COnscreenKeyboardDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
ReleaseFocus();
CRect client;
GetClientRect(client);
int x = 0;
int y = -pKeyHeight;
KEYDEF * key;
POSITION pos = cKeys.GetHeadPosition();
while(pos)
{
key = cKeys.GetNext(pos);
if((key->cNormal == 0x00) && (key->cShifted == 0x00))
{
x = 0;
y += pKeyHeight;
}
else
{
int width = ((abs(key->cWidth) * pKeyWidth) / 10);
CRect rc(x,y,x + width, y + pKeyHeight);
if(key->cWidth < 0)
{
rc.right = client.right;
}
x += width;
if(rc.PtInRect(point))
{
SendKey(key);
}
}
}
}BOOL COnscreenKeyboardDlg::PreTranslateMessage(MSG* pMsg)
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd != this->m_hWnd)
{
if(gFocus != wnd)
{
if(IsWindow(gFocus))
{
char buff[256];
::GetWindowText(wnd,buff,256);
TRACE("%s\n\r",buff);
AttachThreadInput(
GetWindowThreadProcessId(m_hWnd,NULL),
GetWindowThreadProcessId(gFocus,NULL),
FALSE);
} gFocus = wnd;
AttachThreadInput(
GetWindowThreadProcessId(m_hWnd,NULL),
GetWindowThreadProcessId(gFocus,NULL),
TRUE);
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}void COnscreenKeyboardDlg::ReleaseFocus()
{
if(IsWindow(gFocus))
{
HWND wnd = ::GetForegroundWindow();
if(IsWindow(wnd))
{
if(wnd == gFocus)
{
return;
}
}
::SetForegroundWindow(gFocus);
::SetFocus(gFocus);
}
}int COnscreenKeyboardDlg::DescribeKeyState()
{
int state = 0;
short ks;
ks = GetKeyState(VK_CAPITAL);
if(ks & 0x000F) state += 0x01;
ks = GetKeyState(VK_SHIFT);
if(ks & 0xF000) state += 0x02;
ks = GetKeyState(VK_CONTROL);
if(ks & 0xF000) state += 0x04;
return state;
}void COnscreenKeyboardDlg::DrawKeyboard()
{
//............
}long x = 0;
void COnscreenKeyboardDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent == TIMER_ID)
{
int state = DescribeKeyState();
if(state != cCurrentKeyState)
{
DrawKeyboard();
}
}
}