示例#1
0
文件: hook.cpp 项目: byplayer/yamy
// &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);
}
示例#2
0
/**
 * 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);
}
示例#3
0
// 处理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;
}