windows 获取焦点所在窗口或者激活的窗口(要修改焦点所在窗口的输入法)

zlxi 2020-06-01 03:45:50
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);
}



...全文
354 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2020-06-01
  • 打赏
  • 举报
回复
试试把 这一部分功能做成独立的DLL
zlxi 2020-06-01
  • 打赏
  • 举报
回复
需要时间,Sleep(1000),就可以了。已经找到原因了。 但不知道为什么 HIMC hImc = ImmGetContext(hwnd); hImc 总是返回NULL 。是不是其他进程不能通过ImmGetContext获取其他窗口的HIMC

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧