【问题标题】:winapi - rich edit control - how to paste a text using a context menuwinapi - 富编辑控件 - 如何使用上下文菜单粘贴文本
【发布时间】:2020-01-10 10:06:00
【问题描述】:

我这样创建一个编辑窗口:

hwndEdit = CreateWindowEx(
   0, 
   MSFTEDIT_CLASS, 
   TEXT("EDIT"),
   WS_BORDER | WS_CHILD | ES_LEFT,
   20, 
   20, 
   100,
   30,
   gHwnd, 
   NULL, 
   hInst, 
   NULL);

我可以使用键盘快捷键 (ctrl + v) 粘贴文本,但是当我使用鼠标右键时,不会显示上下文菜单(对于标准编辑控件,它可以工作)。我找不到任何 c/c++ 示例代码。如何启用/实现富编辑控件的上下文菜单?

【问题讨论】:

  • 它是自动提供的。我希望你的消息循环做错了什么。
  • 我使用由 Visual Studio 2017 生成的标准 Windows 桌面应用程序代码。我只添加了一个在主窗口内创建编辑控件的代码 - gHwnd。上下文菜单仅适用于标准编辑控件 (CreateWindowEx lpClassName - EDIT)。

标签: winapi


【解决方案1】:

您似乎创建了一个自定义编辑窗口。

您可以通过在 WndProc 中检查 WM_CONTEXTMENU 来处理编辑窗口的右键单击。

通过 wParam 参数获取窗口句柄,将其与您的编辑窗口进行比较,以查看用户是否右键单击了编辑窗口。

从那里,通过CreatePopupMenu() 创建popupmenu

通过InsertMenu()/AppendMenu() 插入/追加到菜单中。

最后,拨打TrackPopupMenu()

代码:

#define IDC_PASTE 102

case WM_CONTEXTMENU:
        if ((HWND)wParam == hwndEdit) 
        {
            m_hMenu = CreatePopupMenu();
            InsertMenu(m_hMenu, 0, MF_BYCOMMAND | MF_STRING | MF_ENABLED, IDC_PASTE, L"Paste");
            TrackPopupMenu(m_hMenu, TPM_TOPALIGN | TPM_LEFTALIGN, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, hWnd, NULL);
    }

接下来您需要处理粘贴消息。从问题可以看出,你的粘贴快捷方式还是有用的,可以使用SendInput模拟粘贴。

代码:

 case WM_COMMAND:
        {
            int wmId = LOWORD(wParam);
            // Parse the menu selections:
            switch (wmId)
            {
            case IDC_PASTE:
            {
                SetForegroundWindow(hwndEdit);
                INPUT ip;
                ip.type = INPUT_KEYBOARD;
                ip.ki.wScan = 0;
                ip.ki.time = 0;
                ip.ki.dwExtraInfo = 0;
                // Press the "Ctrl" key
                ip.ki.wVk = VK_CONTROL;
                ip.ki.dwFlags = 0; // 0 for key press
                SendInput(1, &ip, sizeof(INPUT));

                // Press the "V" key
                ip.ki.wVk = 'V';
                ip.ki.dwFlags = 0; // 0 for key press
                SendInput(1, &ip, sizeof(INPUT));

                // Release the "V" key
                ip.ki.wVk = 'V';
                ip.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput(1, &ip, sizeof(INPUT));

                // Release the "Ctrl" key
                ip.ki.wVk = VK_CONTROL;
                ip.ki.dwFlags = KEYEVENTF_KEYUP;
                SendInput(1, &ip, sizeof(INPUT));
            }
            break;
            ...

【讨论】:

  • 我还可以使用以下代码粘贴文本:SendMessage(hwndEdit, WM_PASTE, 0, 0);也对吗?
  • @Irbis 来自doc,它可以工作。
  • 也许 CreatePopupMenu 和 InsertMenu 应该移到事件过程之外?
  • @Irbis 这只是显示的代码,仅供参考。您可以根据自己的需要进行修改
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2019-08-23
相关资源
最近更新 更多