win7系統。 --- 要修改焦點所在視窗的輸入法,
1.GetForegroundWindow 回傳視窗句柄 為0 。并不能獲取。
到底如何獲取焦點所在視窗。
DWORD dwThread = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
AttachThreadInput(dwThread, GetCurrentThreadId(), TRUE);
HWND hFocus = GetFocus();
std::cout << dwThread << ":" << hFocus << std::endl;
AttachThreadInput(dwThread, GetCurrentThreadId(), FALSE);
--- 要修改焦點所在視窗的輸入法,
void SetImeConversionStatus(HWND& hwnd, _IME_Mode mode)
{
HIMC hImc = ImmGetContext(hwnd);
if (mode == _IME_Off)
{
// IMEオフ
ImmSetOpenStatus(hImc, FALSE);
}
else
{
ImmSetOpenStatus(hImc, TRUE);
DWORD dwConversion = 0;
DWORD dwSentence = 0;
ImmGetConversionStatus(hImc, &dwConversion, &dwSentence);
std::cout << hwnd << ":" << GetLastError() << std::endl;
switch (mode)
{
case _IME_Hiragana: // ひらがな
dwConversion |= IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE;
dwConversion &= ~IME_CMODE_KATAKANA;
break;
case _IME_Katakana: // 全角カタカナ
dwConversion |=
IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_KATAKANA;
break;
case _IME_Alpha: // 全角英數
dwConversion |= IME_CMODE_FULLSHAPE;
dwConversion &= ~(IME_CMODE_NATIVE | IME_CMODE_KATAKANA);
break;
case _IME_KatakanaHalf: // 半角カタカナ
dwConversion |= IME_CMODE_NATIVE | IME_CMODE_KATAKANA;
dwConversion &= ~IME_CMODE_FULLSHAPE;
break;
case _IME_AlphaHalf: // 半角英數
dwConversion &=
~(IME_CMODE_NATIVE | IME_CMODE_FULLSHAPE | IME_CMODE_KATAKANA);
break;
default:
break;
}
ImmSetConversionStatus(hImc, dwConversion, dwSentence);
}
ImmReleaseContext(hwnd, hImc);
}
uj5u.com熱心網友回復:
需要時間,Sleep(1000),就可以了。已經找到原因了。但不知道為什么 HIMC hImc = ImmGetContext(hwnd);
hImc 總是回傳NULL 。是不是其他行程不能通過ImmGetContext獲取其他視窗的HIMC
uj5u.com熱心網友回復:
試試把 這一部分功能做成獨立的DLL轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/13584.html
標籤:進程/線程/DLL
上一篇:緊急求助!跨網段通信問題
下一篇:Clistbox或者CListCtrl, 當前可視區域的最后一行, 只顯示上半行. 此時, 滑鼠點擊該行. 該行會自動上移(完全顯示)
