几何尺寸与公差论坛

 找回密码
 注册
查看: 2913|回复: 9

如何用用程序模拟键盘来控制 Media Player 7?

[复制链接]
发表于 2007-11-14 09:12:48 | 显示全部楼层 |阅读模式
如何用用程序模拟键盘来控制   MEDIA   PLAYER   7,   
  例如   模拟CTRL+P来控制   MEDIA   PLAYER   7的暂停可播放。   
  我用SENDMESSAGE函数可以模拟CTRL键控制其他程序(例如   WINAMP),却对MEDIA   PLAYER   7不起作用。keybd_event函数效果一样。所以请大家帮忙,如果全能控制   MEDIA   PLAYER   7可以重新开贴加分!谢了。
 楼主| 发表于 2007-11-14 09:13:13 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

我说一下我的看法。象MediaPlayer这样支持换肤的程序,一般来说都应该处理WM_LBUTTONDOWN这样的消息,原因很简单,按纽都是自己画的,用CBitmapButton太麻烦了,并且效果很差。所以你只要给窗口发送这个消息就可以了,当然要设定要鼠标位置了,这样才有按钮的作用。
 楼主| 发表于 2007-11-14 09:13:46 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

先谢谢楼上两位的热心帮助!   
  我用SPY++检测media   player7所收到的消息,对于按下象CTRL+P这样的键,   
  media   player7接受到的消息为   
  KEY_DOWN     "VK_CONTROL"     (POST)   
  KEY_DOWN     ""                       (POST)     
  KEY_UP         "VK_CONTROL"     (POST)     
  KEY_UP         ""                       (POST)   
  我用POSTMESSAGE函数模拟,SPY++也检测media   player7收到了我发出的消息,但media   player7就是不响应。   
  模拟鼠标也是一种办法,但鼠标不容易定位到支持换肤的media   player7的‘按钮上。   
  请大家讨论!
 楼主| 发表于 2007-11-14 09:14:09 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

告诉你一个很有效的办法:打开media   player   和spy++,然后在media   player按Ctrl+P,spy检测到WM_COMMAND的消息,其中wparam的低字节就是控件的ID。要模拟这一操作,只需要向media player发一个WM_COMMAND的消息,其WPARAM   设置为刚才查看到的id号。
 楼主| 发表于 2007-11-14 09:14:36 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

希望能对你有所帮助,转贴:   
  模拟键盘和鼠标输入   
        如果它不支持你需要的消息和方法,最简单的解决之道是键盘和鼠标输入模拟。例如,你可以使用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;   
   
  没有这条语句,按下的键永远不会自动释放。
 楼主| 发表于 2007-11-14 09:15:18 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

举例:   
   
  //模拟   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);
 楼主| 发表于 2007-11-14 09:15:59 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

希望下面的一些代码对你有所启发   
  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;   
  }   
  }
 楼主| 发表于 2007-11-14 09:16:18 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

已经结贴啦?   请问最后是如何解决的?   这样的特技用在什么场合啊?   ;)   
   
  我试了一下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停止播放了.
 楼主| 发表于 2007-11-14 09:17:46 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

keybd_event在win98和nt4以后被SendInput代替了,下面的例子将模拟按下‘s’键   
   
  INPUT   keyInput;   
  keyInput.type   =   INPUT_KEYBOARD;   
  keyInput.ki.dwExtraInfo   =   0;   
  keyInput.ki.dwFlags   =   0;   
  keyInput.ki.time   =   0;   
  keyInput.ki.wScan   =   31;   
  keyInput.ki.wVk   =   83;   
  UINT     hr   =   SendInput(1,&keyInput,sizeof(INPUT));可以用归可以用,但是我们可以看一下msdn里面的建议:   
   
  Windows   NT/2000   or   later:   This   function   has   been   superseded.   Use   SendInput   instead.
 楼主| 发表于 2007-11-14 09:18:54 | 显示全部楼层

回复: 如何用用程序模拟键盘来控制 Media Player 7?

如何模拟键盘输入特殊符号,如 ( % @ 等
SendMessage(Edit1.Handle,WM_CHAR,ord('%'),0);//向Edit1输入%
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-6-18 00:07 , Processed in 0.047382 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表