VC中怎么向后台运行的程序发送组合键,比如Ctrl+Alt+S?(这个后台程序的指针,句柄都能正确得到)

不要用key_event那个不能各后台程序发送数据。
要是能用PostMessage,或者SendMessage解决就更好了。希望高手不吝赐教
http://blogs.msdn.com/oldnewthing/archive/2005/05/30/423202.aspx
我查过了,这个PostMessage,SendMessage是不能实现的。大家不用讨论了,上面是MSDN英文版块上的讨论。为了个这耗费三天。。。
如果谁有更好的办法,能向后台发送,但是不影响处在焦点的程序,悬赏可以追加!!!!!!!!!!!

第1个回答  2009-07-24
以下是我的解决方法,经测试有效!
先说一下基本思路:
假设后台运行了一个程序名为"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是直接向特定的线程发送消息,不管其当前是否处于焦点,故其有效
第2个回答  2009-07-23
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,这个函数要等返回的!
第3个回答  2009-07-23
你发送的组合键也不过是希望程序相应并调用相应的函数?

那就直接点,找到后台程序期望的调用入口函数,然后用钩子强制执行本回答被提问者采纳
第4个回答  2009-07-23
有点难。
SetKeyboardState 的话可以设置当前线程的输入状态。不能用
你使用 SendInput 试试。

VC中怎么向后台运行的程序发送组合键,比如Ctrl+Alt+S?(这个后台程序的...
接下来的事情就很简单了,只需将组合键Ctrl+Alt+S一一用PostThreadMessage发送过去就行了,就像使用PostMessage一样!这里说明一下,PostMessage因为是只在程序有焦点时才能有效,而不能对全局键盘消息进行响应,但是PostThreadMessage是直接向特定的线程发送消息,不管其当前是否处于焦点,故其有效 ...

vc中应该如何向窗口发送组合键消息
键 代码SHIFT +CTRL ^ALT %若要指定在按一些键时应同时按住SHIFT、CTRL和ALT键的随便率性组合,请将这些键的代码放在括号内。例如,若要指定按E和C时同时按住SHIFT键,请应用“+(EC)”。若要指定按E时应按住SHIFT,之后按C时不按住 SHIFT,请应用“+EC”。要指定反复的键,请应用 {键数字} ...

请问C# 用什么结构存储 热键(如:ctrl+alt+s)?谢谢
\/\/注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);\/\/注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifi...

C# winform 程序在后台运行 点击快捷键使程序做出相应反应。_百度知 ...
namespace winform窗体托盘后台运行 { public partial class Form1 : Form { \/\/这里在窗体上没有拖拽一个NotifyIcon控件,而是在这里定义了一个变量 private NotifyIcon notifyIcon = null; public Form1() { InitializeComponent(); \/\/调用初始化托盘显示函数 InitialTray()...

一个程序怎么接受窗口外的操作信息,比如在一个程序窗口按下某个键,
VC怎样向另一个程序窗口发送组合键消息,比如“ALT+F"线程menuvc组合键 我在网上搜了老半天了,PostThreadMessage(tID, WM_KEYDOWN, VK_F9, 0);这个方法只能发给线程,窗口收不到消息。下面这个在网上说可以输出”ALT+F"的组合键,但我那个窗口只收到“F" 的键。HWND hWnd = pWnd->m_hWnd;::...

如何用批处理命令运行组合键
ALT % 注意:这样使用时,不用大括号括起这些特殊字符。 要指定在按下多个其他键时,按下 SHIFT、CTRL 和 ALT 的组合,请创建复合字符串参数,用括号括起其中的组合键。例如,要发送的组合键指定: 如果在按 e 和 c 的同时按 SHIFT 键,则发送字符串参数 "+(ec)"。 如果在按 e 时只按 c(而不按 SHI...

任务管理器的高手问题
你可以在这里点击“结束任务”按钮直接关闭某个应用程序,如果需要同时结束多个任务,可以按住Ctrl键复选;点击“新任务”按钮,可以直接打开相应的程序、文件夹、文档或Internet资源,如果不知道程序的名称,可以点击“浏览”按钮进行搜索,其实这个“新任务”的功能看起来有些类似于开始菜单中的运行命令。 2. 进程 这里显...

VB postmessage发送后台Tab
PostMessage 12345,WM_KEYDOWN,VK_A,0& '按下A键PostMessage 12345,WM_UP,VK_A,0& '释放A键好了,一次按键就完成了。现在你可以迫不及待的打开记事本做实验,先用FindWindowEx这类API函数找到记事本程序的句柄,再向它发送键盘消息,期望记事本里能诡异的自动出现字符。可是你马上就是失望了,咦,怎么一点反应也...

游戏多开如何同步发送鼠标左键和鼠标右键比如10开
1)按Home键绑定同步窗口 2)打开主控窗口,按下Alt+左箭头进行控制。关于异步控制,在同步过程中,如果需要不同步点击,按下capslocks键,则为同步窗口取消同步,如要恢复同步,再按一次capslocks键即可。Home            绑定同步窗口 End    &...

按键精灵后台喊话功能有一个这样的脚本,怎么改?
这个不需要下其他插件,只要复制下面脚本,粘贴到按键精灵的源文件中,保存退出就可以了。运行的时候,把其它脚本前面的有效钩去掉,再把游戏置于当前窗口,按脚本的启动热键(默认为F10),然后就可以把游戏置于后台运行了。Delay 125 Plugin hwnd = Window.GetKeyFocusWnd()Delay 125 Rem a Delay 10 Plug...

相似回答