vc判断输入法是中文输入状态还是英文输入状态?

yuanye2016 2016-05-06 03:17:19
在win7下ImmIsIME() 失效,判断不了,我需要在输入时,是中文状态要切换成英文状态输入,而是英文状态时,保持不变再输入,我试了LoadKeyboardLayout()、ActivateKeyboardLayout()装载指定的输入法也不行,谁有好的办法?
hkl=LoadKeyboardLayout(L"00000804", KLF_ACTIVATE);
HKL hk=ActivateKeyboardLayout(hkl, KLF_SETFORPROCESS);
...全文
734 19 打赏 收藏 举报
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
line_us 2016-05-07
  • 打赏
  • 举报
回复
看看到底该怎么弄
schlafenhamster 2016-05-07
  • 打赏
  • 举报
回复
好像只有 ImmSimulateHotKey(m_hwnd, IME_CHOTKEY_IME_NONIME_TOGGLE); 可以跨进程
yuanye2016 2016-05-07
  • 打赏
  • 举报
回复
用LoadKeyboardLayout()、ActivateKeyboardLayout()装载指定的输入法并激活,如装载中文(简体)美式键盘,然后在中文简体美式键盘输入法下输入,不知道这样是否可行?
schlafenhamster 2016-05-07
  • 打赏
  • 举报
回复
即 // OPEN IMM ImmSimulateHotKey(m_hwnd, IME_CHOTKEY_IME_NONIME_TOGGLE); // close IMM keybd_event (VK_LCONTROL, 0, 0, 0); keybd_event (VK_LSHIFT, 0, 0, 0); keybd_event (VK_LSHIFT, 0, KEYEVENTF_KEYUP, 0); keybd_event (VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
schlafenhamster 2016-05-07
  • 打赏
  • 举报
回复
试试 ImmSimulateHotKey(m_hwnd, IME_CHOTKEY_IME_NONIME_TOGGLE); keybd_event (0xA2, 0, 0, 0); keybd_event (0xA0, 0, 0, 0); keybd_event (0xA0, 0, KEYEVENTF_KEYUP, 0); keybd_event (0xA2, 0, KEYEVENTF_KEYUP, 0);
Sandrer 2016-05-07
  • 打赏
  • 举报
回复
其实你的意思很明显,就是禁止使用输入法 首先获得你需要禁止输入法的窗口句柄,再调用 ImmAssociateContext 就可以了 HWND hwndEdit = ::GetDlgItem(m_hWnd, IDC_XXXXX); if (hwndEdit != NULL) ImmAssociateContext(hwndEdit, NULL); 调用了以后,当输入焦点在这个窗口时,输入法会切换成英语
schlafenhamster 2016-05-06
  • 打赏
  • 举报
回复
那可能是 ImmGetContext(hWnd); 不能 跨进程 !
yuanye2016 2016-05-06
  • 打赏
  • 举报
回复
这样使用AttachThreadInput()还是不行
yuanye2016 2016-05-06
  • 打赏
  • 举报
回复
当前活动窗口比如说打开的记事本,在记事本中输入。 AttachThreadInput(::GetWindowThreadProcessId(::GetForegroundWindow(), NULL), //当前焦点窗口的线程ID ::GetCurrentThreadId(), //自己的线程ID TRUE); HWND hWnd = ::GetForegroundWindow(); HIMC hImc = ImmGetContext(hWnd); ImmSetOpenStatus(hImc, FALSE); 不知道这样用AttachThreadInput()是否正确?
schlafenhamster 2016-05-06
  • 打赏
  • 举报
回复
1 “当前活动窗口” 对不 ?不是 另一个 窗口,而是 能 输入的 子窗口 The GetForegroundWindow function returns a handle to the foreground window (the window with which the user is currently working). The system assigns a slightly higher priority to the thread that creates the foreground window than it does to other threads. HWND GetForegroundWindow(VOID) 、、、、、、、、、、、、 2 AttachThreadInput 成功不? BOOL AttachThreadInput( DWORD idAttach, // thread to attach DWORD idAttachTo, // thread to attach to BOOL fAttach // attach or detach );
yuanye2016 2016-05-06
  • 打赏
  • 举报
回复
引用 7 楼 schlafenhamster 的回复:
ImmGetContext The ImmGetContext function retrieves the input context associated with the specified window. HIMC ImmGetContext( HWND hWnd ); Parameters hWnd Handle to the window to retrieve the input context for. Return Values Returns the handle to the input context.
Remarks An application should routinely use this function to retrieve the current input context before attempting to access information in the context. 我要的是在英文输入状态下输入到当前活动窗口中,传入的句柄应该没错啊
schlafenhamster 2016-05-06
  • 打赏
  • 举报
回复
hWnd Handle to the window to retrieve the input context for. 如 CEdit 的 m_hWnd
schlafenhamster 2016-05-06
  • 打赏
  • 举报
回复
ImmGetContext The ImmGetContext function retrieves the input context associated with the specified window. HIMC ImmGetContext( HWND hWnd ); Parameters hWnd Handle to the window to retrieve the input context for. Return Values Returns the handle to the input context. Remarks An application should routinely use this function to retrieve the current input context before attempting to access information in the context.
yuanye2016 2016-05-06
  • 打赏
  • 举报
回复
引用 5 楼 schlafenhamster 的回复:
// This routines calls IMM API to open or close IME. // //********************************************************************** void SteImeOpenClose( HWND hWnd, BOOL fFlag ) { HIMC hIMC; // If fFlag is true then open IME; otherwise close it. if ( !( hIMC = ImmGetContext( hWnd ) ) ) return; ImmSetOpenStatus( hIMC, fFlag );// return 1 ImmReleaseContext( hWnd, hIMC ); }
if ( !( hIMC = ImmGetContext( hWnd ) ) ) return; 总是执行到这句就return了
schlafenhamster 2016-05-06
  • 打赏
  • 举报
回复
// This routines calls IMM API to open or close IME. // //********************************************************************** void SteImeOpenClose( HWND hWnd, BOOL fFlag ) { HIMC hIMC; // If fFlag is true then open IME; otherwise close it. if ( !( hIMC = ImmGetContext( hWnd ) ) ) return; ImmSetOpenStatus( hIMC, fFlag );// return 1 ImmReleaseContext( hWnd, hIMC ); }
yuanye2016 2016-05-06
  • 打赏
  • 举报
回复
AttachThreadInput(::GetWindowThreadProcessId(::GetForegroundWindow(), NULL), //当前焦点窗口的线程ID ::GetCurrentThreadId(), //自己的线程ID TRUE); HWND hWnd = ::GetForegroundWindow(); HIMC hImc = ImmGetContext(hWnd); ImmSetOpenStatus(hImc, FALSE); 这样也不行啊
zgl7903 2016-05-06
  • 打赏
  • 举报
回复
如果要修改其它进程的窗口的输入状态,可能要先 AttachThreadInput
yuanye2016 2016-05-06
  • 打赏
  • 举报
回复
HWND hWnd = ::GetForegroundWindow(); HIMC hImc = ImmGetContext(hWnd) ImmSetOpenStatus(hImc, FALSE) 这样不行啊
zgl7903 2016-05-06
  • 打赏
  • 举报
回复
ImmSetOpenStatus 关闭输入法即可, 另外 WM_INPUTLANGCHANGEREQUEST 返回0, 可以禁止切换输入法
相关推荐
发帖
VC/MFC

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2016-05-06 03:17
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……