// &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); }
void JIme::ResetComposition() { HWND hWnd = JMain::GetInstance().GetJWindow().GetWindowHandle(); HIMC hImc = ImmGetContext(hWnd); ImmSetCompositionString(hImc, SCS_SETSTR, NULL, 0, NULL, 0); ImmReleaseContext(hWnd, hImc); ZeroMemory(&ime_comp_char, 3*sizeof(TCHAR)); }
static void test_ImmNotifyIME(void) { static const char string[] = "wine"; char resstr[16] = ""; HIMC imc; BOOL ret; imc = ImmGetContext(hwnd); msg_spy_flush_msgs(); ret = ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); todo_wine { ok(!ret || broken(ret), /* Vista and W2K8 */ "Canceling an empty composition string should fail.\n"); } ok(!msg_spy_find_msg(WM_IME_COMPOSITION), "Windows does not post " "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " "the composition string being canceled is empty.\n"); ImmSetCompositionString(imc, SCS_SETSTR, string, sizeof(string), NULL, 0); msg_spy_flush_msgs(); ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); ok(!msg_spy_find_msg(WM_IME_COMPOSITION), "Windows does not post " "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " "the composition string being canceled is non empty.\n"); /* behavior differs between win9x and NT */ ret = ImmGetCompositionString(imc, GCS_COMPSTR, resstr, sizeof(resstr)); ok(!ret, "After being cancelled the composition string is empty.\n"); msg_spy_flush_msgs(); ret = ImmNotifyIME(imc, NI_COMPOSITIONSTR, CPS_CANCEL, 0); todo_wine { ok(!ret || broken(ret), /* Vista and W2K8 */ "Canceling an empty composition string should fail.\n"); } ok(!msg_spy_find_msg(WM_IME_COMPOSITION), "Windows does not post " "WM_IME_COMPOSITION in response to NI_COMPOSITIONSTR / CPS_CANCEL, if " "the composition string being canceled is empty.\n"); msg_spy_flush_msgs(); ImmReleaseContext(hwnd, imc); }
LRESULT HandleChangeAttr(HWND hWnd, BOOL fNext) { BYTE bAttr[512]; BYTE bAttrRead[512]; UINT i,j; UINT uClause; UINT uMaxClause; UINT uCnt; UINT uCntRead; BYTE bAt; BOOL fAttrOK = FALSE; BOOL fAttrReadOK = FALSE; HIMC hIMC = NULL; BOOL bRet = FALSE; uMaxClause = (dwCompClsLen / sizeof(DWORD)) - 1; uClause = GetTargetClause(); if (uClause == (DWORD)-1L) { return 0L; } if (fNext) { if (uClause + 1 <= uMaxClause) { uClause++; } else { return 0L; } } else { if (uClause > 0) { uClause--; } else { return 0L; } } uCnt = 0; if (uClause < uMaxClause) { for (i=0; i < uMaxClause; i++) { if (i == uClause) { switch (bCompAttr[dwCompCls[i]]) { case ATTR_INPUT: bAt = ATTR_TARGET_NOTCONVERTED; break; break; case ATTR_CONVERTED: bAt = ATTR_TARGET_CONVERTED; break; default: bAt = bCompAttr[dwCompCls[i]]; break; } } else { switch (bCompAttr[dwCompCls[i]]) { case ATTR_TARGET_CONVERTED: bAt = ATTR_CONVERTED; break; break; case ATTR_TARGET_NOTCONVERTED: bAt = ATTR_INPUT; break; default: bAt = bCompAttr[dwCompCls[i]]; break; } } for (j = 0; j < (dwCompCls[i+1] - dwCompCls[i]); j++) { bAttr[uCnt++] = bAt; } } fAttrOK = TRUE; } uCntRead = 0; if (uClause < uMaxClause) { for (i=0; i < uMaxClause; i++) { if (i == uClause) { switch (bCompReadAttr[dwCompReadCls[i]]) { case ATTR_INPUT: bAt = ATTR_TARGET_NOTCONVERTED; break; break; case ATTR_CONVERTED: bAt = ATTR_TARGET_CONVERTED; break; default: bAt = bCompReadAttr[dwCompReadCls[i]]; break; } } else { switch (bCompReadAttr[dwCompReadCls[i]]) { case ATTR_TARGET_CONVERTED: bAt = ATTR_CONVERTED; break; break; case ATTR_TARGET_NOTCONVERTED: bAt = ATTR_INPUT; break; default: bAt = bCompReadAttr[dwCompReadCls[i]]; break; } } for (j = 0; j < (dwCompReadCls[i+1] - dwCompReadCls[i]); j++) { bAttrRead[uCntRead++] = bAt; } } fAttrReadOK = TRUE; } if (fAttrReadOK && fAttrOK) { hIMC = ImmGetContext(hWndCompStr); #ifdef USEWAPI bRet = ImmSetCompositionStringW(hIMC,SCS_CHANGEATTR,bAttr,uCnt, bAttrRead,uCntRead); #else bRet = ImmSetCompositionString(hIMC,SCS_CHANGEATTR,bAttr,uCnt, bAttrRead,uCntRead); #endif // bRet = ImmSetCompositionString(hIMC,SCS_CHANGEATTR,NULL,0, // bAttrRead,uCntRead); // bRet = ImmSetCompositionString(hIMC,SCS_CHANGEATTR,bAttr,uCnt, // NULL,0); ImmReleaseContext(hWndCompStr,hIMC); } else { #ifdef DEBUG OutputDebugString("Can not call ImmSetCompositionString\r\n"); bRet = TRUE; #endif } #ifdef DEBUG if (!bRet) { OutputDebugString("ImmSetCompositionString return FALSE\r\n"); } #endif return 1; }