几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量

几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 (http://www.dimcax.com/hust/index.php)
-   vc编程 (http://www.dimcax.com/hust/forumdisplay.php?f=76)
-   -   如何用用程序模拟键盘来控制 Media Player 7? (http://www.dimcax.com/hust/showthread.php?t=1526)

huangyhg 2007-11-14 09:12 AM

如何用用程序模拟键盘来控制 Media Player 7?
 
如何用用程序模拟键盘来控制 MEDIA PLAYER 7,
例如 模拟CTRL+P来控制 MEDIA PLAYER 7的暂停可播放。
我用SENDMESSAGE函数可以模拟CTRL键控制其他程序(例如 WINAMP),却对MEDIA PLAYER 7不起作用。keybd_event函数效果一样。所以请大家帮忙,如果全能控制 MEDIA PLAYER 7可以重新开贴加分!谢了。

huangyhg 2007-11-14 09:13 AM

回复: 如何用用程序模拟键盘来控制 Media Player 7?
 
我说一下我的看法。象MediaPlayer这样支持换肤的程序,一般来说都应该处理WM_LBUTTONDOWN这样的消息,原因很简单,按纽都是自己画的,用CBitmapButton太麻烦了,并且效果很差。所以你只要给窗口发送这个消息就可以了,当然要设定要鼠标位置了,这样才有按钮的作用。

huangyhg 2007-11-14 09:13 AM

回复: 如何用用程序模拟键盘来控制 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的‘按钮上。
请大家讨论!

huangyhg 2007-11-14 09:14 AM

回复: 如何用用程序模拟键盘来控制 Media Player 7?
 
告诉你一个很有效的办法:打开media player 和spy++,然后在media player按Ctrl+P,spy检测到WM_COMMAND的消息,其中wparam的低字节就是控件的ID。要模拟这一操作,只需要向media player发一个WM_COMMAND的消息,其WPARAM 设置为刚才查看到的id号。

huangyhg 2007-11-14 09:14 AM

回复: 如何用用程序模拟键盘来控制 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;

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

huangyhg 2007-11-14 09:15 AM

回复: 如何用用程序模拟键盘来控制 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);

huangyhg 2007-11-14 09:15 AM

回复: 如何用用程序模拟键盘来控制 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;
}
}

huangyhg 2007-11-14 09:16 AM

回复: 如何用用程序模拟键盘来控制 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停止播放了.

huangyhg 2007-11-14 09:17 AM

回复: 如何用用程序模拟键盘来控制 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.

huangyhg 2007-11-14 09:18 AM

回复: 如何用用程序模拟键盘来控制 Media Player 7?
 
如何模拟键盘输入特殊符号,如 ( % @ 等
SendMessage(Edit1.Handle,WM_CHAR,ord('%'),0);//向Edit1输入%


所有的时间均为北京时间。 现在的时间是 05:53 AM.