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

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

::PostMessage(hWndFFMPEG,WM_KEYDOWN,VK_RETURN,0);//无效
::PostMessage(hWndFFMPEG,WM_KEYUP,VK_RETURN,0);//无效
可事实是并不会,网上找找发现可能是最后一个参数的问题,可又不知道填什么

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

归纳下如下:

DWORD dwVKFkeyData;
 WORD dwScanCode =MapVirtualKey(VK_F1,0);//VK_F1
 dwVKFkeyData = 1;
 dwVKFkeyData |= dwScanCode<<16;
 dwVKFkeyData |= 0<<24;
 dwVKFkeyData |= 1<<29;
 //按下
 ::PostMessage((HWND)0x203f0,WM_KEYDOWN,VK_F1,dwVKFkeyData);
 //弹起
 dwVKFkeyData |= 3 << 30;
 ::PostMessage((HWND)0x203f0,WM_KEYUP,VK_F1,dwVKFkeyData); 

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组合键

模拟键盘按键


你可能感兴趣的:(VC/MFC)