你的窗口事件回调函数需要处理 WM_IME_REQUEST
消息,其中 wParam
可以是 IMR_QUERYCHARPOSITION
:
lParam
指向一个 IMECHARPOSITION 结构体,其中包含了字符在组合窗口中的位置。
返回值
如果应用程序填充了 IMECHARPOSITION 结构,则返回非零值。否则,该命令将返回 0。
以下是一个示例:
switch (message)
{
// ...
case WM_IME_REQUEST:
{
switch (wParam)
{
case IMR_QUERYCHARPOSITION:
{
IMECHARPOSITION * charPos = (IMECHARPOSITION *)lParam;
charPos->dwSize = sizeof(IMECHARPOSITION);
charPos->pt.x = ; // SET YOUR VALUES HERE
charPos->pt.y = ; // ...
charPos->cLineHeight = ; // ...
charPos->rcDocument.left = ; // ...
charPos->rcDocument.top = ; // ...
charPos->rcDocument.right = ; // ...
charPos->rcDocument.bottom = ;// ...
result = true; // Return true, as required by the docs!
} break;
}
} break;
// ...
}
return result;
您可以将焦点设置到编辑控件上,并调用keybd_event或SendInput。
例如,使用编辑控件hEdit1和keybd_event:
SetFocus(hEdit1);
keybd_event(VK_LWIN, 0, KEYEVENTF_EXTENDEDKEY, 0);
WORD nVkCode = LOBYTE(VkKeyScanEx('.', GetKeyboardLayout(0)));
keybd_event(nVkCode, MapVirtualKey(nVkCode, 0), 0, 0);
keybd_event(nVkCode, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);