如何在VC++中响应ctrl+c(复制消息)

来源:互联网 发布:linux如何退出切换用户 编辑:程序博客网 时间:2024/06/04 18:42

如何在VC++中响应ctrl+c(复制消息)

对于edit类控件来说用户键盘按下ctrl+c时控件父窗口会自动收到wm_copy消息,但是如果是 其它子窗口就需要自己来处理wm_keydown和wm_char来模拟wm_copy消息(当然也可以使用快捷键)。

先用spy++随便选择一个普通的非edit窗口,依次按下ctrl键和字母c,然后再同时按下这两个键,可以看到窗口分别受到了下面几条消息:

ctrl
<000001> 00030A2E P WM_KEYDOWN nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000002> 00030A2E P WM_KEYUP nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:1 fUp:1
c
<000001> 00030A2E P WM_KEYDOWN nVirtKey:'C' cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000002> 00030A2E P WM_CHAR chCharCode:'99' (99) cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000003> 00030A2E P WM_KEYUP nVirtKey:'C' cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:1 fUp:1
ctrl+c
<000001> 00030A2E P WM_KEYDOWN nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000002> 00030A2E P WM_KEYDOWN nVirtKey:'C' cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000003> 00030A2E P WM_CHAR chCharCode:'3' (3) cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<000004> 00030A2E P WM_KEYUP nVirtKey:VK_CONTROL cRepeat:1 ScanCode:1D fExtended:0 fAltDown:0 fRepeat:1 fUp:1
<000005> 00030A2E P WM_KEYUP nVirtKey:'C' cRepeat:1 ScanCode:2E fExtended:0 fAltDown:0 fRepeat:1 fUp:1

所以为了响应ctrl+c消息,可以在消息处理函数中定义两个变量来记录ctrl和c是否同时按下


#pragma region CTRL+C模拟static bool isCtrldown = false;static bool iscdown = false;#pragma endregion CTRL+C模拟

然后在wm_keydown和wm_keyup消息处理处加入下列代码:

case WM_KEYDOWN:// VK_DOWN#pragma regionswitch (wparam){case VK_CONTROL: isCtrldown = true; break;case 'C': iscdown = true; break;break;#pragma endregion

case WM_KEYUP:// VK_UP#pragma regionswitch (wparam){case VK_CONTROL: isCtrldown = false;break;case 'C': iscdown = false;break;}break;#pragma endregion

接下来是响应wm_char的代码:

case WM_CHAR:// CHAR#pragma regionswitch (wparam){case 0x03:// ETX #pragma regionif (isCtrldown && isCtrldown)PostMessage(hwnd, WM_COPY, 121, 0);break;#pragma endregion}break;#pragma endregion

最后只要响应 wm_copy把数据复制到粘帖板就可以了。

0 0
原创粉丝点击