// &SetImeString static void funcSetImeString(HWND i_hwnd, int i_size) { _TCHAR *buf = new _TCHAR(i_size); DWORD len = 0; _TCHAR ImeDesc[GANA_MAX_ATOM_LENGTH]; UINT ImeDescLen; DWORD error; DWORD denom = 1; HANDLE hPipe = CreateFile(addSessionId(HOOK_PIPE_NAME).c_str(), GENERIC_READ, FILE_SHARE_READ, (SECURITY_ATTRIBUTES *)NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL); error = ReadFile(hPipe, buf, i_size, &len, NULL); CloseHandle(hPipe); ImeDescLen = ImmGetDescription(GetKeyboardLayout(0), ImeDesc, sizeof(ImeDesc)); if (_tcsncmp(ImeDesc, _T("SKKIME"), ImeDescLen) > 0) denom = sizeof(_TCHAR); HIMC hIMC = ImmGetContext(i_hwnd); if (hIMC == INVALID_HANDLE_VALUE) return; int status = ImmGetOpenStatus(hIMC); ImmSetCompositionString(hIMC, SCS_SETSTR, buf, len / denom, NULL, 0); delete buf; ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_COMPLETE, 0); if (!status) ImmSetOpenStatus(hIMC, status); ImmReleaseContext(i_hwnd, hIMC); }
/** * Class: sun_awt_windows_WInputMethod * Method: getNativeIMMDescription * Signature: ()Ljava/lang/String; * * This method tries to get the information about the input method associated with * the current active thread. * */ JNIEXPORT jstring JNICALL Java_sun_awt_windows_WInputMethod_getNativeIMMDescription (JNIEnv *env, jobject self) { TRY; // Get the keyboard layout of the active thread. HKL hkl = AwtComponent::GetKeyboardLayout(); LPTSTR szImmDescription = NULL; UINT buffSize = 0; jstring infojStr = NULL; if ((buffSize = ::ImmGetDescription(hkl, szImmDescription, 0)) > 0) { szImmDescription = (LPTSTR) safe_Malloc(buffSize * sizeof(TCHAR)); if (szImmDescription != NULL) { ImmGetDescription(hkl, szImmDescription, buffSize); infojStr = JNU_NewStringPlatform(env, szImmDescription); free(szImmDescription); } } return infojStr; CATCH_BAD_ALLOC_RET(NULL); }
// 处理WM_KEYDOWN消息 LRESULT CDuiWkeView::OnWmKeyDown(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { bool handled = true; unsigned int virtualKeyCode = wParam; unsigned int flags = 0; bool bShiftState = false; if (HIWORD(lParam) & KF_REPEAT) flags |= WKE_REPEAT; if (HIWORD(lParam) & KF_EXTENDED) flags |= WKE_EXTENDED; if((GetKeyState(VK_SHIFT) & 0x8000) || (VK_SHIFT == wParam)) bShiftState = true; HKL hKL = GetKeyboardLayout(0); int i = LOWORD(hKL); TCHAR buffer[255]; memset(buffer,0,255 * sizeof(TCHAR)); if( (i == 0x0804) && (ImmIsIME(hKL)) ) { ImmGetDescription(hKL,buffer,255); if(buffer[0] != NULL) { if(( wParam & 0x80 ) | (wParam >= 0x70 && wParam <= 0x7F )) { if( !IsFocusControl() ) return 0; } } } if(wParam >= 0x70 && wParam <= 0x7F ) { handled = m_pWebView->keyDown(virtualKeyCode, flags, false); m_render.render(m_pWebView); if( wParam == 0x74 ) { MSG msg; msg.hwnd = hWnd; msg.message = WM_CHAR; msg.wParam = virtualKeyCode; msg.lParam = lParam; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } if( !IsFocusControl() ) return 0; } handled = m_pWebView->keyDown(virtualKeyCode, flags, false); m_render.render(m_pWebView); if(!bShiftState) { if( !GetKeyState(VK_CAPITAL) ) { if((wParam >= 'A') && (wParam <= 'Z')) virtualKeyCode = tolower(wParam); } if(wParam != VK_SHIFT) { if( wParam > 0x80 ) return 0; } }else { if(wParam != VK_SHIFT) { //wParam = wParam & 0x7F;//`~ //virtualKeyCode = wParam; if(wParam == '1' || wParam == '3' || wParam == '4' || wParam == '5' ) virtualKeyCode = wParam - 0x10; else if(wParam == '2') virtualKeyCode = '@'; else if(wParam == '6') virtualKeyCode = '^'; else if(wParam == '7') virtualKeyCode = '&'; else if( wParam == '8') virtualKeyCode = '*' ; else if( wParam == '9') virtualKeyCode = '('; else if(wParam == '0') virtualKeyCode = ')'; else if(wParam == 45) virtualKeyCode = '_'; else if(wParam == '=') virtualKeyCode = '+'; else if(wParam == '[') virtualKeyCode = '{'; else if(wParam == ']') virtualKeyCode = '}'; else if(wParam == ';') virtualKeyCode = ':'; else if(wParam == '\'') virtualKeyCode = '"'; else if(wParam == '\\') virtualKeyCode = '|'; else if(wParam == ',') virtualKeyCode = '<'; else if(wParam == '.') virtualKeyCode = '>'; else if(wParam == '/') virtualKeyCode = '?'; else if(wParam == '`') virtualKeyCode = '~'; else if(wParam > 0x80) return 0; } } MSG msg; msg.hwnd = hWnd; msg.message = WM_CHAR; msg.wParam = virtualKeyCode; msg.lParam = lParam; ::TranslateMessage(&msg); ::DispatchMessage(&msg); return 0; }