阅读:1739回复:5
求教计算机获取鼠标输入的全过程
在下请教各位大虾,使用windows(以2000,98为例),当我们点击(鼠标左键)一个窗口的关闭按钮后,窗口关闭。问
1、计算机系统(软,硬)知道我们我们这个动作的过程 2、计算机硬件部分如何相应? 3、计算机软件(操作系统)如何响应? 4、应用程序如何知道这个动作? |
|
沙发#
发布于:2004-09-23 13:10
在下请教各位大虾,使用windows(以2000,98为例),当我们点击(鼠标左键)一个窗口的关闭按钮后,窗口关闭。问 鼠标点击--产生鼠标事件- 鼠标事件--点关闭按钮,只是发送消息WM_CLOSE给应用程序 |
|
|
板凳#
发布于:2004-09-23 18:41
太粗略了!这样我就用不了来这问了!
我是想知道根详细的!从硬件的响应倒驱动的响应到应用程序的详细过程,thank you |
|
地板#
发布于:2004-09-24 09:36
这个题是大家不削答,还是太难?
我只是想对计算机系统能有个系统性的认识,还是请清除的大虾们赐教,发邮件也行oyangfeng9808@sina.com |
|
地下室#
发布于: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再在进程列表中去掉该进程 |
|
5楼#
发布于:2005-02-21 23:18
对于1.2条
至于驱动程序是怎么得知鼠标移动的 那与串口、PS/2接口的鼠标硬件协议有关 …… 其实我也不太清楚 在DOS下一般这样做的: 启动MOUSE.EXE 这样就可以使用Int33h中断查询鼠标了 在Windows下可以看成这样――在Windows的启动画面中,Windows调用MOUSE.EXE鼠标驱动,自然进了桌面后有鼠标 至于消息队列,学了数据结构就明白了 至于多任务多线程,学了汇编远跳转就明白了 至于虚拟内存管理,去学80386保护模式编程 |
|