向某个窗口发送按键消息(包括后台隐藏的窗口)

在一个项目中需要调用第三方的控制台程序进行录音,录音完成需要敲个回车键结束录音.控制台程序是在后台隐藏运行,使用 spy++可找到其窗口名,便可通过 findwindow 找到其句柄hWnd,本以为可使用SendMessage 和 PostMessage 开始发消息了

::PostMessage(hWndFFMPEG,WM_KEYDOWN,VK_RETURN,0);//无效
::PostMessage(hWndFFMPEG,WM_KEYUP,VK_RETURN,0);//无效

可事实是并不会,网上找找发现可能是最后一个参数的问题,可又不知道填什么

后面了解到扫描码,已经获取扫描码函数 MapVirtualKey ,通过这个函数名终于找到了想要的资料

归纳下如下:

	CString strFFmpegWindName;
	strFFmpegWindName.Format(_T("%stest.exe"),theApp.g_strExePath);//程序路径
	HWND hWndFFMPEG = ::FindWindow(NULL, strFFmpegWindName);//获取待发送按键程序句柄
	if (NULL != hWndFFMPEG)
	{		
		DWORD dwVKFkeyData;//lParam 参数值
		WORD dwScanCode =MapVirtualKey(VK_RETURN,0);//获取回车虚拟按键VK_RETURN的键盘扫描码
		dwVKFkeyData = 1;
		dwVKFkeyData |= dwScanCode<<16;
		dwVKFkeyData |= 0<<24;
		dwVKFkeyData |= 1<<29;
		//按下
		::PostMessage(hWndFFMPEG,WM_KEYDOWN,VK_RETURN,dwVKFkeyData);
		//弹起
		dwVKFkeyData |= 3 << 30;
		::PostMessage(hWndFFMPEG,WM_KEYUP,VK_RETURN,dwVKFkeyData);
		Sleep(500);
	}

dwVKFkeyData 参数是一个8位数的16进制(例:0x412e0001)

(个人理解)下面所说的位是二进制数,0-15位相当于16进制数低4位,就是上例中的 0001,用二进制来展示就是 0000 0000 0000 0001

0-15位:指定当前消息的重复次数。其值就是用户按下该键后自动重复的次数,但是重复次数不累积
16-23位:指定其扫描码,其值依赖于OEM厂商
24位:指定该按键是否为扩展按键,所谓扩展按键就是Ctrl,Alt之类的,如果是扩展按键,其值为1,否则为0
25-28位:保留字段,暂时不可用
29位:指定按键时的上下文,其值为1时表示在按键时Alt键被按下,其值为0表示WM_SYSKEYDOWN消息因没有任何窗口有键盘焦点而被发送到当前活动窗口。
30位:指定该按键之前的状态,其值为1时表示该消息发送前,该按键是被按下的,其值为0表示该消息发送前该按键是抬起的。
31位:指定其转换状态,对WM_SYSKEYDOWN消息而言,其值总为0。

微软原文:http://msdn.microsoft.com/en-us/library/ms646280%28VS.85%29.aspx

其他参考:

PostMessage 向Windows窗口发送Alt组合键

模拟键盘按键

 

  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值