c++程序中怎么向没有界面的exe发送按键动作

Pafey 2018-01-24 11:01:14
具体情况:
我想在程序中通过调用外部exe形式,使用 ffmpeg.exe 带参数形式录音,
ffmpeg -f dshow -i audio="麦克风 (Realtek High Definition Au"  F:\ffmpeg\call_record_3.mp3


我用 ShellExecute 或者 WinExec 可以开始录音.
手动在cmd窗口调用ffmpeg录音的情况如下:


在这个情况下 ffmpeg 是在录音状态下,手动按 'q' 键可以停止录音.

我现在的问题是不知道怎么在程序中对这个正在录音的 ffmpeg 停止录音,不知道怎么给 ffmpeg 发送 'q' 按键.
...全文
572 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
mirro 2018-11-27
  • 打赏
  • 举报
回复
窗户没有添加消息映射吧?
qq_20296489 2018-11-22
  • 打赏
  • 举报
回复
引用 29 楼 qiangzi4646 的回复:
UINT nRetCmd = WinExec(cmd.c_str(),SW_SHOW);

代码加颜色效果出不来啊


我也是在这个CMD输入Q的问题上困扰了好久 这是我找到的最接近答案的帖子了
qq_20296489 2018-11-22
  • 打赏
  • 举报
回复
引用 29 楼 qiangzi4646 的回复:
UINT nRetCmd = WinExec(cmd.c_str(),SW_SHOW);

代码加颜色效果出不来啊



能不能把全部代码都分享一下 这样说的有点懵
赵4老师 2018-01-26
  • 打赏
  • 举报
回复
引用 24 楼 qiangzi4646 的回复:
[quote=引用 23 楼 zhao4zhong1 的回复:] http://www.autohotkey.com
模拟按键我已经试过了,..不行呀 我的问题是不是描述错了, 其实我就是想停止ffmpeg的录音,没有去用ffmpeg的sdk,而是偷懒直接程序里使用 ffmpeg 带参数方式开启录音 但,停不掉了,一直在录, 可以杀掉进程,停止, 但是录音文件不准确,因为ffmpeg是一段一段往文件里写的, 只有正常按q退出,才会正常收尾. 怎么办?[/quote] 我不信autohotkey脚本搞不定。
Pafey 2018-01-26
  • 打赏
  • 举报
回复
UINT nRetCmd = WinExec(cmd.c_str(),SW_SHOW);
代码加颜色效果出不来啊
Pafey 2018-01-26
  • 打赏
  • 举报
回复
直接对 hWnd 发消息还是管用的 我后面一直以为,没有界面的exe是没有hWnd的,或者说这个 hWnd 是无效的. 没想到是我的发送的消息过不去 我是这么试出来的,我在调用exe的时候没有隐藏,把ffmpeg显示出来了,激活窗体手动去按的时候,光按q没反应,按住 alt+q 才可以,或者 Ctrl+ C 强制关闭
UINT nRetCmd = WinExec(cmd.c_str(),SW_SHOW);
难得在程序里调用其他的exe 发送的按键都需要加上 Alt ? 不管怎样,问题解决了,谢谢各位的思路.
Pafey 2018-01-26
  • 打赏
  • 举报
回复
引用 25 楼 paschen 的回复:
估计窗口没激活,没输入进去,可以再加上SetWindowPos置顶并激活,同时每条语句输入一个间隔,如Sleep(200);
搞清楚了,获取到hWndFFMPEG 后,这样发消息,需要同时发送Alt+q
::PostMessage(hWndFFMPEG,WM_SYSKEYDOWN,0x71,1<<29);//发送Alt+q 0x71 
paschen 版主 2018-01-25
  • 打赏
  • 举报
回复
估计窗口没激活,没输入进去,可以再加上SetWindowPos置顶并激活,同时每条语句输入一个间隔,如Sleep(200);
Pafey 2018-01-25
  • 打赏
  • 举报
回复
引用 23 楼 zhao4zhong1 的回复:
http://www.autohotkey.com
模拟按键我已经试过了,..不行呀 我的问题是不是描述错了, 其实我就是想停止ffmpeg的录音,没有去用ffmpeg的sdk,而是偷懒直接程序里使用 ffmpeg 带参数方式开启录音 但,停不掉了,一直在录, 可以杀掉进程,停止, 但是录音文件不准确,因为ffmpeg是一段一段往文件里写的, 只有正常按q退出,才会正常收尾. 怎么办?
Pafey 2018-01-25
  • 打赏
  • 举报
回复
引用 10 楼 zilaishuichina 的回复:
搜 "输入重定向"
还有这个大哥说的重定向没搞明白,先搜搜.
赵4老师 2018-01-25
  • 打赏
  • 举报
回复
Pafey 2018-01-25
  • 打赏
  • 举报
回复
引用 12 楼 paschen 的回复:
引用 6 楼 qiangzi4646 的回复:
引用 5 楼 paschen 的回复:
比较容易的办法就将这个窗口前置,然后模拟键盘按键,如使用keybd_event API
不知道怎么获取到这个hWnd::SetForegroundWindow(hWnd);
用CreateProcess创建进程后可以获得进程句柄,网上搜索“通过进程句柄获取窗口”
hWnd是获取到了,可是还是没效果,貌似ffmpeg不接受啊,手动在cmd里面按q,ffmpeg.exe进程会自动关闭,我这样发消息或者模拟键盘按键都没反应,进程依然在
		DWORD pid =getProcessIdFromName(_T("ffmpeg.exe"));
		if (0 != pid)
		{
			HWND hWndFFMPEG = GetWindowHwndByPorcessID(pid);
			if (NULL != hWndFFMPEG)
			{
				//方法1
				//::PostMessage(hWndFFMPEG, WM_KEYDOWN, 'q', 1); //按下
				//::PostMessage(hWndFFMPEG,WM_KEYUP, 'q', 1);    //释放

				//方法2
				//::PostMessage(hWndFFMPEG,WM_CHAR,'q',NULL);//发送按键消息 

				//方法3
				//把窗口放到前台接收输入
				::SetForegroundWindow(hWndFFMPEG);
				//键盘事件
				INPUT ip;
				ip.type=INPUT_KEYBOARD;
				ip.ki.wScan=0;
				ip.ki.time=0;
				ip.ki.dwExtraInfo=0;
				//按下			q 0x71         a 0x41  
				ip.ki.wVk=0x71;
				ip.ki.dwFlags=0;
				::SendInput(1,&ip,sizeof(INPUT));
				//抬起
				ip.ki.dwFlags=KEYEVENTF_KEYUP;
				::SendInput(1,&ip,sizeof(INPUT));
			}
		}
Pafey 2018-01-25
  • 打赏
  • 举报
回复
引用 11 楼 l357630798 的回复:
IPC问题还没找到更简单的方法,一般用双匿名管道,也就是9楼的办法!
管道好像不行啊,接收消息的exe不受我控制啊,通过管道给它发消息,没反应啊
weixin_41675313 2018-01-25
  • 打赏
  • 举报
回复
emmm...
weixin_41675313 2018-01-25
  • 打赏
  • 举报
回复
额 其实我也不知道
weixin_41675313 2018-01-25
  • 打赏
  • 举报
回复
.......
Pafey 2018-01-25
  • 打赏
  • 举报
回复
引用 9 楼 hdt 的回复:
看不到明白,能大概解释下流程么,我也找了几个管道的例子,比如这个 http://blog.csdn.net/guyue35/article/details/47186797 但是里面的writepipe 并没有生效
Pafey 2018-01-25
  • 打赏
  • 举报
回复
引用 9 楼 hdt 的回复:
看不到明白,能大概解释下流程么,我也找了几个管道的例子,比如这个 http://blog.csdn.net/guyue35/article/details/47186797 但是里面的writepipe 并没有生效
Pafey 2018-01-25
  • 打赏
  • 举报
回复
引用 9 楼 hdt 的回复:
看不到明白,能大概解释下流程么,我也找了几个管道的例子,比如这个 http://blog.csdn.net/guyue35/article/details/47186797 但是里面的writepipe 并没有生效
lwg0869 2018-01-25
  • 打赏
  • 举报
回复
我记得有一个向线程发消息的函数
加载更多回复(10)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧