oyangfeng
驱动牛犊
驱动牛犊
  • 注册日期2004-03-17
  • 最后登录2004-09-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1739回复:5

求教计算机获取鼠标输入的全过程

楼主#
更多 发布于:2004-09-23 10:00
在下请教各位大虾,使用windows(以2000,98为例),当我们点击(鼠标左键)一个窗口的关闭按钮后,窗口关闭。问
1、计算机系统(软,硬)知道我们我们这个动作的过程
2、计算机硬件部分如何相应?
3、计算机软件(操作系统)如何响应?
4、应用程序如何知道这个动作?
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-23 13:10
在下请教各位大虾,使用windows(以2000,98为例),当我们点击(鼠标左键)一个窗口的关闭按钮后,窗口关闭。问
1、计算机系统(软,硬)知道我们我们这个动作的过程
2、计算机硬件部分如何相应?
3、计算机软件(操作系统)如何响应?
4、应用程序如何知道这个动作?


鼠标点击--产生鼠标事件-

鼠标事件--点关闭按钮,只是发送消息WM_CLOSE给应用程序
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
oyangfeng
驱动牛犊
驱动牛犊
  • 注册日期2004-03-17
  • 最后登录2004-09-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-23 18:41
太粗略了!这样我就用不了来这问了!
我是想知道根详细的!从硬件的响应倒驱动的响应到应用程序的详细过程,thank you
oyangfeng
驱动牛犊
驱动牛犊
  • 注册日期2004-03-17
  • 最后登录2004-09-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-24 09:36
这个题是大家不削答,还是太难?
我只是想对计算机系统能有个系统性的认识,还是请清除的大虾们赐教,发邮件也行oyangfeng9808@sina.com
zyl910
驱动牛犊
驱动牛犊
  • 注册日期2005-02-20
  • 最后登录2006-09-28
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-02-21 23:07
-- Windows系统内核 -----
1.操作系统查询鼠标驱动,将鼠标操作翻译成Wndows消息并放入系统消息队列
2.在系统消息队列的鼠标消息利用发送WM_NCHITTEST消息得知该鼠标消息该发给那个窗口(的线程消息队列)
-- 应用程序 -------------
3.在该线程的消息循环中,GetMessage得到一条消息,并用DispatchMessage分发该消息到该窗口的窗口函数
4.由于关闭按键在非客户区,所以窗口函数收到的是WM_NCLBUTTONDOWN消息。由于应用程序一般不处理非客户区消息,该消息最终交给DefWindowProc函数
5.DefWindowProc函数处理WM_NCLBUTTONDOWN消息时,发现现在正点击在关闭按钮上,于是更新“关闭按钮”的图像,并用SetCapture设置鼠标捕获(这样鼠标消息会不断的发送到该窗口),还有一些界面性操作就不细说了(如设置浮动提示)
6.经历了许多WM_NCMOUSEMOV消息(谁敢说自己点鼠标时鼠标没颤动)后,DefWindowProc函数终于接受到了WM_LBUTTONUP消息。现在它判断鼠标坐标是否在关闭按钮的坐标范围内,若是,则表示真的是点了“关闭”,此时DefWindowProc函数会向窗口函数发送WM_SYSCOMMAND消息、SC_CLOSE参数
7.一般窗口函数不处理WM_SYSCOMMAND消息,所以该消息又传给了DefWindowProc(注意此时发生了重入现象)
8.DefWindowProc处理WM_SYSCOMMAND消息的策略是:用GetSystemMenu取得系统菜单,并检查SC_CLOSE菜单项是否可用,若可用,则发送向窗口函数发送WM_CLOSE消息
9.窗口函数一般对于WM_CLOSE消息的处理是:弹出一个对话框,问你是否退出。若否,窗口函数返回0。若是,将该消息传递给DefWindowProc继续操作(2次重入)
10.DefWindowProc调用DestroyWindow摧毁窗口
11.DestroyWindow在摧毁窗口前,向窗口函数发送WM_DESTROY消息通知窗口即将摧毁
12.窗口函数执行资源释放操作,若是主窗口则调用PostQuitMessage通知程序即将结束(只是标记状态,实际操作在下面),还依然调用DefWindowProc释放内部资源(3次重入),函数调用完后又回到DestroyWindow
13.DestroyWindow正式摧毁窗口及该窗口的子窗口(控件),完成后向窗口函数发送WM_NCDESTROY消息通知窗口已经摧毁
14.窗口函数和DefWindowProc一般不处理WM_NCDESTROY消息,只是简单的返回。此时再也没有任何操作,只有一连串的函数返回:DestroyWindow、WM_CLOSE、WM_SYSCOMMAND、WM_LBUTTONUP、DispatchMessage,最终回到了消息循环
15.由于PostQuitMessage做了标记,所以GetMessage返回0,退出消息循环,执行WinMain下面的代码(一般是释放程序资源的代码)
-- 编译器 --------------
16.WinMain执行完毕后,现在执行的是编译器插入的代码,用于释放全局变量(调用相应对象的析构函数)等资源释放操作
-- Windows -------------
17.当编译器代码执行完后,程序会回到Windows系统安排的线程启动代码,这将自动调用ExitThread及ExitProcess(主线程)结束线程
-- Windows内核 -----------
18.当某个线程、进程即将终止时,Windows调用各个dll的入口函数,通知线程、进程即将终止
19.进程真的要中止了,先将该进程的所有线程冻结(既这些线程再也不会分配到CPU时间片),再释放相关资源:dll、内核对象、虚拟内存空间
20.当上面的一切完成时,Windows再在进程列表中去掉该进程
zyl910
驱动牛犊
驱动牛犊
  • 注册日期2005-02-20
  • 最后登录2006-09-28
  • 粉丝0
  • 关注0
  • 积分50分
  • 威望5点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-02-21 23:18
对于1.2条
至于驱动程序是怎么得知鼠标移动的
那与串口、PS/2接口的鼠标硬件协议有关
……
其实我也不太清楚

在DOS下一般这样做的:
启动MOUSE.EXE
这样就可以使用Int33h中断查询鼠标了

在Windows下可以看成这样――在Windows的启动画面中,Windows调用MOUSE.EXE鼠标驱动,自然进了桌面后有鼠标

至于消息队列,学了数据结构就明白了
至于多任务多线程,学了汇编远跳转就明白了
至于虚拟内存管理,去学80386保护模式编程
游客

返回顶部