屏幕键盘的问题。输入英文字还可以,在打开输入法的时候,就有问题了

解决方案 »

  1.   

    OnLButtonDown(UINT nFlags, CPoint point) 
    {
    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);
    }
      

  2.   

    具体的代码就是这样的,我就有点搞不懂了,我没有打开输入法的时候,是完全可以输入字符的。但是等到我把输入法打开以后,就不能输入了,也就是输入的字符,在文本中是看不见的。
    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();
    }
    }
    }