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
你发送的组合键也不过是希望程序相应并调用相应的函数?
那就直接点,找到后台程序期望的调用入口函数,然后用钩子强制执行