在Win32中如何设置表情弹出位置

3
Windows 10已经添加了通过热键Windows+句点打开的表情符号对话框,自2017年以来。我的应用程序如何设置该对话框的位置,以使其显示在应用程序插入符附近?欢迎提供C++示例。
我的应用程序使用自定义绘制控件,并带有自制插入符(使用Delphi编写)。

Examlpe of popup


这个功能在我的电脑上没有起作用,但是后来我在OneNote中尝试了一下,它就可以正常工作了,现在它可以与所有应用程序和任何编辑控件一起使用。我是犯了错误还是发生了某种激活? - Barmak Shemirani
2个回答

3

你的窗口事件回调函数需要处理 WM_IME_REQUEST 消息,其中 wParam 可以是 IMR_QUERYCHARPOSITION

WM_IME_REQUEST 文档

IMR_QUERYCHARPOSITION 文档

lParam

指向一个 IMECHARPOSITION 结构体,其中包含了字符在组合窗口中的位置。

返回值

如果应用程序填充了 IMECHARPOSITION 结构,则返回非零值。否则,该命令将返回 0。

IMECHARPOSITION 文档

以下是一个示例:

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;

-2

您可以将焦点设置到编辑控件上,并调用keybd_eventSendInput

例如,使用编辑控件hEdit1keybd_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);

无法正常工作。我的应用程序使用自定义控件,其中包含自制的插入符(使用 Delphi 编写)。 - Prog1020
你不能将键盘焦点设置到你的窗口吗? - Castorix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接