zmxjh9988
驱动牛犊
驱动牛犊
  • 注册日期2005-02-15
  • 最后登录2005-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1526回复:5

win2000下,通过8042,模拟鼠标单击

楼主#
更多 发布于:2005-02-16 18:09
我想在win2000下,通过控制8042模拟鼠标单击。

我在程序中,每次对8042的60h,64h端口进行操作时,都会导致键盘、鼠标没有响应,只能重新启动。

能不能在应用程序中,通过outport,inport的方式操作,因为我不知道怎样写驱动程序。

谢谢大家,我都查了几天资料了。
zmxjh9988
驱动牛犊
驱动牛犊
  • 注册日期2005-02-15
  • 最后登录2005-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-16 18:14
以下是我在win2000下,用vc6写的一个例子,但没有作用,并有时让键盘和鼠标没有响应。
void CtestDlg::OnBnClickedButton1()
{
       // 对 8042 键盘控制芯片进行编程  
       // 允许 mouse 接口
Outport(0x64,0xa8);

        // 通知 8042 下个字节的发向 0x60 的数据将发给 mouse
Outport(0x64,0xd4);

        // 允许 mouse 发数据
Outport(0x60,0xf4);

       // 通知 8042,下个字节的发向 0x60 的数据应放向 8042 的命令寄存器
Outport(0x64,0x60);

        //鼠标左键按下
Outport(0x60,0x09);
Outport(0x60,0x0);
Outport(0x60,0x0);

        //鼠标左键释放
Outport(0x60,0x08);
Outport(0x60,0x0);
Outport(0x60,0x0);
 }
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-16 18:40
直接写控制器应该不可以
你为什么要这样写呢?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
zmxjh9988
驱动牛犊
驱动牛犊
  • 注册日期2005-02-15
  • 最后登录2005-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-16 18:52
其实用什么方式无所谓,只是不想用winapi,因为winapi的sendmessage和mouse_event都不是真正产生硬件鼠标单击

我查资料时,看到类似的应用,所以就这样试试。

如果不这样写,可以怎样写呢?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-21 15:33
以下是我在win2000下,用vc6写的一个例子,但没有作用,并有时让键盘和鼠标没有响应。
void CtestDlg::OnBnClickedButton1()
{
       // 对 8042 键盘控制芯片进行编程  
       // 允许 mouse 接口
Outport(0x64,0xa8);

        // 通知 8042 下个字节的发向 0x60 的数据将发给 mouse
Outport(0x64,0xd4);

        // 允许 mouse 发数据
Outport(0x60,0xf4);

       // 通知 8042,下个字节的发向 0x60 的数据应放向 8042 的命令寄存器
Outport(0x64,0x60);

        //鼠标左键按下
Outport(0x60,0x09);
Outport(0x60,0x0);
Outport(0x60,0x0);

        //鼠标左键释放
Outport(0x60,0x08);
Outport(0x60,0x0);
Outport(0x60,0x0);
 }
 

操作port在ring3下是禁止的,写个键盘过滤驱动
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
zmxjh9988
驱动牛犊
驱动牛犊
  • 注册日期2005-02-15
  • 最后登录2005-02-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-02-21 18:35
Outport我是采用NTPort Library公司的Lib做的,所以应该没问题。

我尝试过做驱动,在驱动中,用IRP_MJ_READ读鼠标状态时,死机,代码如下:
newIrp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,devExt->TopOfStack,&input,sizeof(MOUSE_INPUT_DATA),&FilePointer,&event,&iostatus);


MyIoStackIrp = IoGetNextIrpStackLocation(newIrp);
MyIoStackIrp = IRP_MJ_READ;
MyIoStackIrp->Parameters.Read.Length = sizeof(MOUSE_INPUT_DATA);
MyIoStackIrp->Parameters.Read.ByteOffset.QuadPart = 0;
//下面这行死行,不知道是原因
NtStatus = IoCallDriver(devExt->TopOfStack, newIrp);
if (NtStatus == STATUS_PENDING)
{
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
NtStatus = iostatus.Status;
}
游客

返回顶部