• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

高分求解模拟键盘输入

Leo 2002-03-09 12:51:47
如何用用程序模拟键盘来控制 MEDIA PLAYER 7,
例如 模拟CTRL+P来控制 MEDIA PLAYER 7的暂停可播放。
我用SENDMESSAGE函数可以模拟CTRL键控制其他程序(例如 WINAMP),却对MEDIA PLAYER 7不起作用。keybd_event函数效果一样。所以请大家帮忙,如果却能控制 MEDIA PLAYER 7可以重新开贴加分!谢了。
...全文
28 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
已经结贴啦? 请问最后是如何解决的? 这样的特技用在什么场合啊? ;)

我试了一下SendMessage怎么可以啊? 你的Media Player 7.0?

我的是8.0, OS = XP.

能告诉我你是如何获得Media Player的窗口的句柄的吗?

我用spy++看到的消息是WM_COMMAND, wParam = 00018028
lParam = 00000000

获得句柄后发消息即可:
if (found) {
MessageBox("found!");
::SendMessage( nextWnd->m_hWnd,
WM_COMMAND,
0X00018028, //WPARAM wParam,
0 //LPARAM lParam
);
};

这是个加速键,最后程序得到的是控件通知消息,

就这样,Media Player停止播放了.
回复
Flexlm 2002-03-28
希望下面的一些代码对你有所启发
void CParameterSet::KeyDown(BYTE KeyData)
{
int vk;
switch(KeyData)
{
case 0x30://'0'
vk=VkKeyScan('0')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x31://'1'
vk=VkKeyScan('1')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x32://'2'
vk=VkKeyScan('2')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x33://'3'
vk=VkKeyScan('3')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x34://'4'
vk=VkKeyScan('4')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x35://'5'
vk=VkKeyScan('5')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x36://'6'
vk=VkKeyScan('6')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x37://'7'
vk=VkKeyScan('7')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x38://'8'
vk=VkKeyScan('8')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x39://'9'
vk=VkKeyScan('9')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x41://'A'
vk=VkKeyScan('A')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x42://'B'
vk=VkKeyScan('B')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x43://'C'
vk=VkKeyScan('C')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x44://'D'
vk=VkKeyScan('D')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x45://'E'
vk=VkKeyScan('E')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x46://'F'
vk=VkKeyScan('F')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x47://'G'
vk=VkKeyScan('G')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x48://'H'
vk=VkKeyScan('H')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x49://'I'
vk=VkKeyScan('I')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x4A://'J'
vk=VkKeyScan('J')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x4B://'K'
vk=VkKeyScan('K')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x4C://'L'
vk=VkKeyScan('L')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x4D://'M'
vk=VkKeyScan('M')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x4E://'N'
vk=VkKeyScan('N')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x4F://'O'
vk=VkKeyScan('O')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x50://'P'
vk=VkKeyScan('P')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x51://'Q'
vk=VkKeyScan('Q')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x52://'R'
vk=VkKeyScan('R')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x53://'S'
vk=VkKeyScan('S')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x54://'T'
vk=VkKeyScan('T')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x55://'U'
vk=VkKeyScan('U')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x56://'V'
vk=VkKeyScan('V')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x57://'W'
vk=VkKeyScan('W')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x58://'X'
vk=VkKeyScan('X')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x59://'Y'
vk=VkKeyScan('Y')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x5A://'Z'
vk=VkKeyScan('Z')&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x5B://'TAB'
//vk=VkKeyScan(VK_TAB);
vk=VK_TAB;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x5C://'确认'
vk=VkKeyScan(0x0D)&0xFF;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x5D://'取消'
vk=VK_CANCEL;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x5E://'复位'
break;
case 0x5F://'删除'
vk=VK_DELETE;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x60://'UP'
vk=VK_UP;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x61://'DOWN'
vk=VK_DOWN;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x62://'LEFT'
vk=VK_LEFT;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
case 0x63://'RIGHT'
vk=VK_RIGHT;
keybd_event(vk,0,0,0);
keybd_event(vk,0,KEYEVENTF_KEYUP,0);
break;
default:
break;
}
}
回复
nne998 2002-03-27
举例:

//模拟 alt + F
keybd_event(VK_MENU,0,KEYEVENTF_EXTENDEDKEY | 0,0);
keybd_event('F',0,KEYEVENTF_EXTENDEDKEY | 0,0);
keybd_event('F',0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
keybd_event(VK_MENU,0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
回复
killhs 2002-03-27
true98说的很对可以查看WM_COMMAND消息,来控制别的程序。
我曾写过可以通过+ -来控制解霸的播方速度!
我记的《电脑编程技巧与维护》中有一篇类似的文章!
http://www.comprg.com.cn
回复
No_love 2002-03-27
希望能对你有所帮助,转贴:
模拟键盘和鼠标输入
如果它不支持你需要的消息和方法,最简单的解决之道是键盘和鼠标输入模拟。例如,你可以使用Tab模拟转移到期望的控件。

使你做到这一点的函数是SendInput,它是一个一般的USER API。SendInput需要三个参数:要执行的键盘和鼠标动作的个数,INPUT结构数组,INPUT结构数组的大小。每个INPUT元素详细描述了一个要执行的动作。注意,按下一个按钮接着释放它是两个不同的动作,因此要建立两个INPUT元素。在例程中,SendInput函数用于模拟关闭Find: All Files 对话框的Alt-F4键盘序列:

INPUT input[4];

memset(input, 0, sizeof(input));



input[0].type = input[1].type = input[2].type =

input[3].type = INPUT_KEYBOARD;

input[0].ki.wVk = input[2].ki.wVk = VK_MENU;

input[1].ki.wVk = input[3].ki.wVk = VK_F4;

//接下来释放它,这一点很重要。

input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;

input[0].ki.time = input[1].ki.time =

input[2].ki.time = input[3].ki.time = GetTickCount();

SendInput(4, input, sizeof(INPUT));

在这个代码片断中,input[ ].type = INPUT_KEYBOARD表明要模拟键盘输入,input[ ].ki.dwFlags和input[ ].ki.wVk表明要执行的动作以及此动作的受键。特别要注意下面的语句:

input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP;

没有这条语句,按下的键永远不会自动释放。

回复
zhougaomin_007 2002-03-25
写驱动程序模拟
回复
Leo 2002-03-23
可以从模拟键盘的方向考虑吗?
可以在USER MODE完全模拟键盘吗?

回复
Leo 2002-03-23
可以从模拟键盘的方向考虑
回复
ma811 2002-03-23
用mouse_even去点那个按键
回复
Leo 2002-03-18
还是不行,还有其它招吗?
回复
Leo 2002-03-15
十分True98() 和其他热心的朋友!
我去试试这些方法!
加分!
回复
lunar3 2002-03-14
keybd_event().
回复
True98 2002-03-14
告诉你一个很有效的办法:打开media player 和spy++,然后在media player按Ctrl+P,spy检测到WM_COMMAND的消息,其中wparam的低字节就是控件的ID。要模拟这一操作,只需要向media player发一个WM_COMMAND的消息,其WPARAM 设置为刚才查看到的id号。
回复
Leo 2002-03-10
key_event() 好像不行,我来试试sendInput
回复
cppnet 2002-03-10
key_event()
回复
greenery 2002-03-10
是过sendInput了吗?
回复
Leo 2002-03-10
先谢谢楼上两位的热心帮助!
我用SPY++检测media player7所收到的消息,对于按下象CTRL+P这样的键,
media player7接受到的消息为
KEY_DOWN "VK_CONTROL" (POST)
KEY_DOWN "P" (POST)
KEY_UP "VK_CONTROL" (POST)
KEY_UP "P" (POST)
我用POSTMESSAGE函数模拟,SPY++也检测media player7收到了我发出的消息,但media player7就是不响应。
模拟鼠标也是一种办法,但鼠标不容易定位到支持换肤的media player7的‘按钮上。
请大家讨论!
回复
cwsuperman 2002-03-09
我说一下我的看法。象MediaPlayer这样支持换肤的程序,一般来说都应该处理WM_LBUTTONDOWN这样的消息,原因很简单,按纽都是自己画的,用CBitmapButton太麻烦了,并且效果很差。所以你只要给窗口发送这个消息就可以了,当然要设定要鼠标位置了,这样才有按纽的作用。
回复
bluekite 2002-03-09
有沒有試過把Focus設置到media player7上或者它的按鈕上,然後模擬按鍵呢?
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-03-09 12:51
社区公告

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