使用 Win32 处理 Ctrl+C

Adi*_*vit 5 winapi keyboard-events

我有一个 Win32 窗口消息循环。CTRL我想通过+拦截“复制到剪贴板” C
我目前的做法是这样处理:

...
case WM_KEYDOWN:
   TranslateMessage(&message);

   // Intercept Ctrl+C for copy to clipboard
   if ('C' == message.wParam && (::GetKeyState(VK_CONTROL)>>15))
   { // do the copy... }
...
Run Code Online (Sandbox Code Playgroud)

除了显式检查击键组合之外,还有更好的方法吗?

有没有某种方法可以注册标准的复制到剪贴板击键然后处理WM_COPY消息?

use*_*194 2

Windows 将Ctrl+C, Ctrl+V,Ctrl+X视为消息中的一个键WM_CHAR

enum
{
 CTRL_BASE  = 'A' - 1,
 SELECT_ALL = 'A' - CTRL_BASE, // Ctrl+A
 COPY       = 'C' - CTRL_BASE, // Ctrl+C
 CUT        = 'X' - CTRL_BASE, // Ctrl+X
 PASTE      = 'V' - CTRL_BASE, // Ctrl+V
 UNDO       = 'Z' - CTRL_BASE, // Ctrl+Z
 REDO       = 'Y' - CTRL_BASE, // Ctrl+Y
};
Run Code Online (Sandbox Code Playgroud)

注意: MSDN - WM_CHAR message中没有记录这一点。这是我在创建文本编辑器时观察到的。虽然在键盘输入Ctrl+A == 0x41中提到过。

使用WM_CHAR而不是手动处理WM_KEYDOWN等使处理更接近标准,特别是在按住某个键时自动重复,并且在按住额外的键时不会发出消息。

WM_COPY显然,除了钥匙之外,没有现成的方法可以为您送货。

  • 这样可能会更清楚:`enum { CTRL_BASE = 'A'-1, SELECT_ALL = 'A' - CTRL_BASE, COPY = 'C' - CTRL_BASE, CUT = 'X' - CTRL_BASE }`等 (2认同)