首页 > 解决方案 > winapi - 富编辑控件 - 如何使用上下文菜单粘贴文本

问题描述

我以这种方式创建了一个编辑窗口:

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++ 示例代码。如何启用/实现富编辑控件的上下文菜单?

标签: winapi

解决方案


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

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

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

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

通过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;
            ...

推荐阅读