虚拟键盘

hellofire 2003-08-22 02:30:23
如何利用程序给另外的程序发送虚拟键盘消息(组合键)?
例如给AAA程序模拟发送ctrl+F1的输入?
...全文
90 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bager 2003-08-22
  • 打赏
  • 举报
回复
可以使用PostThreadMessage API函数,此做法的前提是需要知道此进程的主线程ID,对于SDI类型的应用程序比较好用。

以下示例向记事本中发送F1按键消息,及Ctrl + P组合键消息,希望对你有所启示、帮助。
你的应用程序所要接收的消息组合Ctrl + F1所对应具体的消息组合可以通过Spy++得到,再将发送消息部分稍做修改即可。


STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;//隐藏窗口;
si.wShowWindow = SW_HIDE;
ZeroMemory(&pi, sizeof(pi));

if(!CreateProcess(NULL, "D:\\WINNT\\NOTEPAD.EXE",
NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
  AfxMessageBox("运行NOTEPAD失败!请确认执行文件是否存在。");
}
else
{
  Sleep(1000);
  //F1
  PostThreadMessage(pi.dwThreadId, WM_SYSKEYDOWN, VK_F1, 1);
  PostThreadMessage(pi.dwThreadId, WM_SYSKEYUP, VK_F1, 1);

  //Ctrl + P
  PostThreadMessage(pi.dwThreadId, WM_SYSKEYDOWN, VK_CONTROL, 0x1);
  PostThreadMessage(pi.dwThreadId, WM_SYSKEYDOWN, 'P', 0x1);
  PostThreadMessage(pi.dwThreadId, WM_CHAR, 0x10, 0x1);

}

类似问题的链接如下:
http://expert.csdn.net/Expert/topic/2120/2120812.xml?temp=.5733606
思危 2003-08-22
  • 打赏
  • 举报
回复
代码不在手边,回去找找
hellofire 2003-08-22
  • 打赏
  • 举报
回复
能给我个例子吗?
思危 2003-08-22
  • 打赏
  • 举报
回复
虚拟键盘的例子很多呀,我也写过。
将目标程序和发送程序挂接到同一个硬件输入消息队列上。
hellofire 2003-08-22
  • 打赏
  • 举报
回复
zhouyong0371(小周周)你的意思是
PostMessage(hwnd,WM_KEYDWON,VK_CONTROL,0);
PostMessage(hwnd,WM_KEYDWON,VK_F1,0);
PostMessage(hwnd,WM_KEYUP,VK_CONTROL,0);
PostMessage(hwnd,WM_KEYUP,VK_F1,0);
?
这样不行吧
zhouyong0371 2003-08-22
  • 打赏
  • 举报
回复
是这样的,你发送的时候,只要有消息通知对方程序要做什么就可以了,激发了Ctrl的Down事件后,在它Up之前在激发一个键盘事件就可以达到效果了。
ruihuahan 2003-08-22
  • 打赏
  • 举报
回复
字符被你的没有输入焦点的程序得到了,有输入焦点的程序怎么办?这样做只会把系统输入搞乱。
hellofire 2003-08-22
  • 打赏
  • 举报
回复
我想指定输入到某一个窗体上
hellofire 2003-08-22
  • 打赏
  • 举报
回复
呵呵你们的方法我以前就试过了,不行.因为我的接受输入的程序不一定拥有焦点
kingzai 2003-08-22
  • 打赏
  • 举报
回复
try Sendinput or keybd_event
such as
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(VK_F1, 0, 0, 0);
keybd_event(VK_F1, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
papaya_stone 2003-08-22
  • 打赏
  • 举报
回复
keybd_event(VK_CONTROL,0,0,0);
keybd_event(VK_F1,0,0,0);
keybd_event(VK_F1,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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