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


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » 程序设计 » vc编程
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2007-11-14, 09:12 AM   #1
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 如何用用程序模拟键盘来控制 Media Player 7?

如何用用程序模拟键盘来控制 MEDIA PLAYER 7,
例如 模拟CTRL+P来控制 MEDIA PLAYER 7的暂停可播放。
我用SENDMESSAGE函数可以模拟CTRL键控制其他程序(例如 WINAMP),却对MEDIA PLAYER 7不起作用。keybd_event函数效果一样。所以请大家帮忙,如果全能控制 MEDIA PLAYER 7可以重新开贴加分!谢了。
huangyhg离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
旧 2007-11-14, 09:13 AM   #2
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 Media Player 7?

我说一下我的看法。象MediaPlayer这样支持换肤的程序,一般来说都应该处理WM_LBUTTONDOWN这样的消息,原因很简单,按纽都是自己画的,用CBitmapButton太麻烦了,并且效果很差。所以你只要给窗口发送这个消息就可以了,当然要设定要鼠标位置了,这样才有按钮的作用。
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
旧 2007-11-14, 09:13 AM   #3
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 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的‘按钮上。
请大家讨论!
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
旧 2007-11-14, 09:14 AM   #4
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 Media Player 7?

告诉你一个很有效的办法:打开media player 和spy++,然后在media player按Ctrl+P,spy检测到WM_COMMAND的消息,其中wparam的低字节就是控件的ID。要模拟这一操作,只需要向media player发一个WM_COMMAND的消息,其WPARAM 设置为刚才查看到的id号。
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
旧 2007-11-14, 09:14 AM   #5
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 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;

没有这条语句,按下的键永远不会自动释放。
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
旧 2007-11-14, 09:15 AM   #6
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 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);
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
旧 2007-11-14, 09:15 AM   #7
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 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;
}
}
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
旧 2007-11-14, 09:16 AM   #8
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 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停止播放了.
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
旧 2007-11-14, 09:17 AM   #9
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 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.
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
旧 2007-11-14, 09:18 AM   #10
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 回复: 如何用用程序模拟键盘来控制 Media Player 7?

如何模拟键盘输入特殊符号,如 ( % @ 等
SendMessage(Edit1.Handle,WM_CHAR,ord('%'),0);//向Edit1输入%
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



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


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多