winapi - 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++ 示例代码。如何启用/实现富编辑控件的上下文菜单?
解决方案
您似乎已经创建了一个自定义编辑窗口。
您可以通过检查 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;
...
推荐阅读
- json - 如何使用 HTTPClient 从 JSON 文件中检索的 ID 值填充 Select 控件
- python - 控制 travis 中的 Python 详细程度/日志处理程序级别,以减轻由于超出日志文件大小而导致的错误
- functional-programming - 了解单子遍历的副作用
- android - 在 Android 上生成单元测试
- xslt-2.0 - XML 到 XML,无法使用带有重复元素的选择副本
- regex - 在 nifi 中使用正则表达式删除额外值时出错
- vba - 如何在 Outlook 打开后 2 分钟在 Outlook 上启动宏
- php - 使用 $write->save 的 Phpspreadsheet 不起作用 - 错误处理
- angular - 它的等效事件在 blazor 中发出 angular/vue?
- oracle - Oracle APEX - 没有前导零