如何在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 region
switch (wparam)
{
case VK_CONTROL: isCtrldown = true; break;
case 'C': iscdown = true; break;
break;
#pragma endregion
case WM_KEYUP: // VK_UP
#pragma region
switch (wparam)
{
case VK_CONTROL: isCtrldown = false; break;
case 'C': iscdown = false; break;
}
break;
#pragma endregion
接下来是响应wm_char的代码:
case WM_CHAR: // CHAR
#pragma region
switch (wparam)
{
case 0x03: // ETX
#pragma region
if (isCtrldown && isCtrldown)
PostMessage(hwnd, WM_COPY, 121, 0);
break;
#pragma endregion
}
break;
#pragma endregion
最后只要响应 wm_copy把数据复制到粘帖板就可以了。