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

如何在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把数据复制到粘帖板就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值