问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VC中怎么向后台运行的程序发送组合键,比如Ctrl+Alt+S?(这个后台程序的...

发布网友 发布时间:2024-10-04 01:41

我来回答

4个回答

热心网友 时间:2024-10-20 21:42

你发送的组合键也不过是希望程序相应并调用相应的函数?

那就直接点,找到后台程序期望的调用入口函数,然后用钩子强制执行

热心网友 时间:2024-10-20 21:44

以下是我的解决方法,经测试有效!
先说一下基本思路:
假设后台运行了一个程序名为"Test_2.exe"的文件
先根据文件名获得此程序的进程ID,然后得到拥有其消息队列的线程ID,然后使用PostThreadMessage向该线程发送你的消息
-----------------------------------------------------
需要的头文件:
#include <windows.h>
#include <TLHELP32.H>
-----------------------------------------------------
获得线程ID的方法:
DWORD GetThreadIDFromName(char* name)
{
HANDLE snapshot;
PROCESSENTRY32 processinfo;
THREADENTRY32 threadinfo;
DWORD dwProcessID, dwThreadID;

processinfo.dwSize = sizeof(PROCESSENTRY32);
threadinfo.dwSize = sizeof(THREADENTRY32);
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if(!snapshot)
return FALSE;

BOOL status = Process32First(snapshot, &processinfo);
while(status)
{
if(!stricmp(name,processinfo.szExeFile))
{
dwProcessID = processinfo.th32ProcessID;
break;
}
status = Process32Next(snapshot, &processinfo);
}
//return dwProcessID;
status = Thread32First(snapshot, &threadinfo);
while(status)
{
if(threadinfo.th32OwnerProcessID == dwProcessID)
{
dwThreadID = threadinfo.th32ThreadID;
break;
}
status = Thread32Next(snapshot, &threadinfo);
}
CloseHandle(snapshot);

return dwThreadID;
}
-----------------------------------------------------
主程序里的调用方法,这里以WM_QUIT 为例:
char* name = "Test_2.exe";
DWORD tID = GetThreadIDFromName(name);
PostThreadMessage(tID, WM_QUIT, 0, 0);
经测试,程序Test_2.exe在主程序运行后确实实现了退出
-----------------------------------------------------
接下来的事情就很简单了,只需将组合键Ctrl+Alt+S一一用PostThreadMessage发送过去就行了,就像使用PostMessage一样!
这里说明一下,PostMessage因为是只在程序有焦点时才能有效,而不能对全局键盘消息进行响应,但是PostThreadMessage是直接向特定的线程发送消息,不管其当前是否处于焦点,故其有效

热心网友 时间:2024-10-20 21:44

PostMessage(WM_SYSKEYDOWN,VK_CONTROL);//按下CONTROL
PostMessage(WM_SYSKEYDOWN,VK_MENU);//按下ALT
PostMessage(WM_KEYDOWN,'S');//按下S
PostMessage(WM_KEYUP,'S');//放开S
PostMessage(WM_SYSKEYUP,VK_MENU);//放开ALT
PostMessage(WM_SYSKEYUP,VK_CONTROL);//放开CONTROL

PostMessage函数其他参数自己写
不要用SendMessage,这个函数要等返回的!

热心网友 时间:2024-10-20 21:41

有点难。
SetKeyboardState 的话可以设置当前线程的输入状态。不能用
你使用 SendInput 试试。

热心网友 时间:2024-10-20 21:42

PostMessage(WM_SYSKEYDOWN,VK_CONTROL);//按下CONTROL
PostMessage(WM_SYSKEYDOWN,VK_MENU);//按下ALT
PostMessage(WM_KEYDOWN,'S');//按下S
PostMessage(WM_KEYUP,'S');//放开S
PostMessage(WM_SYSKEYUP,VK_MENU);//放开ALT
PostMessage(WM_SYSKEYUP,VK_CONTROL);//放开CONTROL

PostMessage函数其他参数自己写
不要用SendMessage,这个函数要等返回的!

热心网友 时间:2024-10-20 21:44

以下是我的解决方法,经测试有效!
先说一下基本思路:
假设后台运行了一个程序名为"Test_2.exe"的文件
先根据文件名获得此程序的进程ID,然后得到拥有其消息队列的线程ID,然后使用PostThreadMessage向该线程发送你的消息
-----------------------------------------------------
需要的头文件:
#include <windows.h>
#include <TLHELP32.H>
-----------------------------------------------------
获得线程ID的方法:
DWORD GetThreadIDFromName(char* name)
{
HANDLE snapshot;
PROCESSENTRY32 processinfo;
THREADENTRY32 threadinfo;
DWORD dwProcessID, dwThreadID;

processinfo.dwSize = sizeof(PROCESSENTRY32);
threadinfo.dwSize = sizeof(THREADENTRY32);
snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if(!snapshot)
return FALSE;

BOOL status = Process32First(snapshot, &processinfo);
while(status)
{
if(!stricmp(name,processinfo.szExeFile))
{
dwProcessID = processinfo.th32ProcessID;
break;
}
status = Process32Next(snapshot, &processinfo);
}
//return dwProcessID;
status = Thread32First(snapshot, &threadinfo);
while(status)
{
if(threadinfo.th32OwnerProcessID == dwProcessID)
{
dwThreadID = threadinfo.th32ThreadID;
break;
}
status = Thread32Next(snapshot, &threadinfo);
}
CloseHandle(snapshot);

return dwThreadID;
}
-----------------------------------------------------
主程序里的调用方法,这里以WM_QUIT 为例:
char* name = "Test_2.exe";
DWORD tID = GetThreadIDFromName(name);
PostThreadMessage(tID, WM_QUIT, 0, 0);
经测试,程序Test_2.exe在主程序运行后确实实现了退出
-----------------------------------------------------
接下来的事情就很简单了,只需将组合键Ctrl+Alt+S一一用PostThreadMessage发送过去就行了,就像使用PostMessage一样!
这里说明一下,PostMessage因为是只在程序有焦点时才能有效,而不能对全局键盘消息进行响应,但是PostThreadMessage是直接向特定的线程发送消息,不管其当前是否处于焦点,故其有效

热心网友 时间:2024-10-20 21:37

有点难。
SetKeyboardState 的话可以设置当前线程的输入状态。不能用
你使用 SendInput 试试。

热心网友 时间:2024-10-20 21:40

你发送的组合键也不过是希望程序相应并调用相应的函数?

那就直接点,找到后台程序期望的调用入口函数,然后用钩子强制执行
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何理解“时间就是空间,空间就是时间”? 办公室副主任竞聘演讲稿范文 学校办公室主任竞聘演讲稿范文 最新办公室主任竞聘演讲稿 办公室主任竞聘演讲稿优秀范文 ...堆墨现象,墨线 接地和粘度都正常,请问应如何解决 ...都正常了开始喷印结果喷一条墨线好恐怖怎么解决呀各位老师 威力喷码机 求一份学生会演讲词 大学学生会个人优秀演讲稿 投影仪灯泡的寿命多久 「投影仪灯泡可用时间有多长」 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'dbo.cang... 关于MFC按键的问题 关于MFC的2个小问题 洋葱有哪些创意吃法推荐? 怎么在手机访问电脑网页 洋葱有哪些创意吃法? 买椟还珠的成语映射了现在社会包装设计的什么现象 宝.珠还的成语 ...但是显示无internet 访问,本地连接显示网络电缆被告拔出 hp打印机如何下载驱动安装? 直接在邻居猫上插了根网线连接到我的笔记本本电脑上面,显示本地已连... 请问怎么用xp.GHO和xp000001.GHS两个文件恢复系统? 我的电脑里只有.gho和.ghs两个文件,没有exe文件。现在系统崩溃请问我... ghost做系统镜像,只剩下*.ghs文件了,还能恢复吗?谢谢 笔记本电脑连接Wi-Fi后显示无互联网无法上网,其他人手机和笔记本电脑连 ... gho镜像还原遇到问题 笔记本用无线路由器上网,可以连接到路由器但是老是显示无internet访问... 我的笔记本电脑与房东共用一根网线,为什么房东的能上网,我的连接时就... 两个300安蓄电池需要多少瓦太阳能光伏板 C语言 队列 平滑 数据 心管搏动是什么意思 什么是心管搏动 心脏搏动强烈什么原因 带地下室的一楼怎么设计 脑子有虫症状 抖音金戈铁马身披麒麟甲我要追你到落霞-离人赋歌词分享 一闭眼睛脑子里全都是小虫子在爬怎么回事 徐州宠物医院哪个好 江西中路详细地址 上海中央商场投资有限公司怎么样? 徐州市哪家宠物医院好 徐州哪家宠物医院比较好,医生比较负责,比较有经验? Binder是如何实现一对多的 如何实现2个C类地址的linux服务器的互联,就是变成类似一个路由器下... ...使用?父子进程的同步又是如何实现的? 消息通信的工作原理是什么... 怎么在电脑上唱歌像KTV一样,我家摄像头上有话筒还用单独买个话筒吗? 苹果相册显示未连网,怎么解决? 斜日半飞阁,高帘轻翳空。 “草铺斜日野田春”的出处是哪里