![]() |
如何用用程序模拟键盘来控制 Media Player 7?
如何用用程序模拟键盘来控制 MEDIA PLAYER 7,
例如 模拟CTRL+P来控制 MEDIA PLAYER 7的暂停可播放。 我用SENDMESSAGE函数可以模拟CTRL键控制其他程序(例如 WINAMP),却对MEDIA PLAYER 7不起作用。keybd_event函数效果一样。所以请大家帮忙,如果全能控制 MEDIA PLAYER 7可以重新开贴加分!谢了。 |
回复: 如何用用程序模拟键盘来控制 Media Player 7?
我说一下我的看法。象MediaPlayer这样支持换肤的程序,一般来说都应该处理WM_LBUTTONDOWN这样的消息,原因很简单,按纽都是自己画的,用CBitmapButton太麻烦了,并且效果很差。所以你只要给窗口发送这个消息就可以了,当然要设定要鼠标位置了,这样才有按钮的作用。
|
回复: 如何用用程序模拟键盘来控制 Media Player 7?
先谢谢楼上两位的热心帮助!
我用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的‘按钮上。 请大家讨论! |
回复: 如何用用程序模拟键盘来控制 Media Player 7?
告诉你一个很有效的办法:打开media player 和spy++,然后在media player按Ctrl+P,spy检测到WM_COMMAND的消息,其中wparam的低字节就是控件的ID。要模拟这一操作,只需要向media player发一个WM_COMMAND的消息,其WPARAM 设置为刚才查看到的id号。
|
回复: 如何用用程序模拟键盘来控制 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; 没有这条语句,按下的键永远不会自动释放。 |
回复: 如何用用程序模拟键盘来控制 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); |
回复: 如何用用程序模拟键盘来控制 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; } } |
回复: 如何用用程序模拟键盘来控制 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停止播放了. |
回复: 如何用用程序模拟键盘来控制 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. |
回复: 如何用用程序模拟键盘来控制 Media Player 7?
如何模拟键盘输入特殊符号,如 ( % @ 等
SendMessage(Edit1.Handle,WM_CHAR,ord('%'),0);//向Edit1输入% |
所有的时间均为北京时间。 现在的时间是 05:53 AM. |