WINDOWS运行机制
Windows程序运行机制 Windows程序运行机制
Winmain函数的程序代码功能: Winmain函数的程序代码功能: 函数的程序代码功能 1、产生并显示程序的主窗口。 窗口创建并 产生并显示程序的主窗口。 显示后, 显示后,用户便可以在窗口上进行各种操作 了,用户的操作及程序状态的变化都以消息 的形式放到了应用程序的消息队列中。 的形式放到了应用程序的消息队列中。 2、从消息队列循环取走消息, 并将消息派 从消息队列循环取走消息, 发到窗口过程函数中去处理。 发到窗口过程函数中去处理。当消息循环取 到 一 条 WM_QUIT 消 息 时 , 将 结 束 循 环 , WinMain函数返回 结束整个程序的运行。 WinMain 函数返回 , 结束整个程序的运行 。 函数返回,
Windows程序运行机制 Windows程序运行机制
消息响应: 消息响应: 应用程序得到消息后,就要对消息进行处理, 应用程序得到消息后,就要对消息进行处理, 这即我们通常说的消息响应。 这即我们通常说的消息响应。 消息响应是我们通过编码实现的,这也是 消息响应是我们通过编码实现的, Windows程序的主要代码区 在消息响应代码中, Windows程序的主要代码区。在消息响应代码中, 程序的主要代码区。 可以调用操作系统提供的API函数 函数, 可以调用操作系统提供的API函数,以便完成特定 的功能。 的功能。 例如收到窗口的WM_CLOSE消息, 例如收到窗口的WM_CLOSE消息,可以调用 消息 DestroyWindow这个 DestroyWindow这个API函数来关闭该窗口,或 这个API函数来关闭该窗口 函数来关闭该窗口, 是用MessageBox这个 这个API函数来提示用户是否真 是用MessageBox这个API函数来提示用户是否真 的要关闭窗口。 的要关闭窗口。
Windows程序运行机制 Windows程序运行机制
WPARAM wParam: wParam: LPARAM lParam: lParam: 用于对消息进行补充说明,如 用于对消息进行补充说明, message成员表示字符消息 message成员表示字符消息,但没有说明 成员表示字符消息, 输入的是哪个字符, 输入的是哪个字符,这就需要用其他变量对 其进行补充说明。wParam,lParam代表的 其进行补充说明。wParam,lParam代表的 意义,随消息的不同而异。 意义,随消息的不同而异。
Windows程序运行机制 Windows程序运行机制
4.WinMain函数 4.WinMain函数 WinMain是Windows程序的入口点函数 WinMain是Windows程序的入口点函数。 程序的入口点函数。 WinMain函数的原型如下 WinMain函数的原型如下: 函数的原型如下: int WINAPI WinMain( HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance LPSTR lpCmdLine, // pointer to command line int nCmdShow // show state of window );
Windows程序运行机制 Windows程序运行机制
操作系统要管理和操作这些资源, 操作系统要管理和操作这些资源,都是 通过句柄来找到对应的资源的。 通过句柄来找到对应的资源的。按资源的类 又可将句柄细分成图标句柄(HICON), 型,又可将句柄细分成图标句柄(HICON), 光标句柄(HCURSOR),窗口句柄 光标句柄(HCURSOR),窗口句柄 ), HWND), ),应用程序实例句柄 (HWND),应用程序实例句柄 HINSTANCE),等等各种类型的句柄。 ),等等各种类型的句柄 (HINSTANCE),等等各种类型的句柄。 操作系统给每一个窗口指定的一个唯一的标 识号即窗口句柄。 识号即窗口句柄。
Windows程序运行机制 Windows程序运行机制
第三个参数lpCmdLine 是一个字符串 第三个参数 lpCmdLine是一个字符串 , 里 是一个字符串, 面包含有传递给应用程序的参数串, 面包含有传递给应用程序的参数串,如:双 盘下的1 txt 文件方式启动 文件方式启动notepad. 击 C 盘下的 1.txt文件方式启动 notepad.exe 程序,传递给notepad.exe程序的参数串即 程序,传递给notepad.exe程序的参数串即 “c:\1.txt”,不包含应用程序名本身。 “c: txt”,不包含应用程序名本身。 第四个参数nCmdShow指定的程序的窗口 第四个参数nCmdShow指定的程序的窗口 应该如何显示,如最大化,最小化,隐藏等。 应该如何显示,如最大化,最小化,隐藏等。
Windows程序运行机制 Windows程序运行机制
第二个参数hPrevInstance表示当前实例的 第二个参数hPrevInstance表示当前实例的 上一个正在运行的, 上一个正在运行的,由同一个应用程序所产 生的实例的句柄。如果该值为NULL,则表示 生的实例的句柄。如果该值为NULL,则表示 当前实例是该程序正在运行的第一份实例。 当前实例是该程序正在运行的第一份实例。 如果该值不为NULL,只能表示当前实例不是 如果该值不为NULL,只能表示当前实例不是 该程序正在运行的第一份实例。 该程序正在运行的第一份实例。
Windows程序运行机制 Windows程序运行机制
该函数接受四个参数,这些参数都是系统调 该函数接受四个参数, WinMain函数时 传递给应用程序的。 函数时, 用WinMain函数时,传递给应用程序的。 第一个参数hInstance表示该程序的当前运 第一个参数hInstance表示该程序的当前运 行的实例句柄。 行的实例句柄。同一应用程序在同一计算机 上可运行多份实例,每启动一个这样的实例, 上可运行多份实例,每启动一个这样的实例, 操作系统都要给该实例分配一个标识号, 操作系统都要给该实例分配一个标识号,即 实例句柄, 实例句柄,随后系统调用程序中的 WinMain函数 WinMain函数,并将该实例句柄传递给参 函数, hInstance。 数hInstance。
Windows程序运行机制 Windows程序运行机制
3.关于句柄(HANDLE) 3.关于句柄 关于句柄(HANDLE) 在Windows程序中产生的任何一个资源, Windows程序中产生的任何一个资源 程序中产生的任何一个资源, 如图标,光标,窗口,应用程序的实例( 如图标,光标,窗口,应用程序的实例(已 加载到内存运行中的程序)。操作系统都要 加载到内存运行中的程内存,并为这些内存指定 一个唯一的标识号, 一个唯一的标识号,这个标识号即该资源的 句柄。 句柄。
Windows程序运行机制 Windows程序运行机制
操作系统将每个事件都包装成一个称为消息的 结构体MSG来传递给应用程序的 参看MSDN, 来传递给应用程序的, 结构体MSG来传递给应用程序的,参看MSDN, MSG结构定义如下 MSG结构定义如下: 结构定义如下: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG; // msg
Windows程序运行机制 Windows程序运行机制
2、关于消息 如用户在某个程序活动时按了一下键盘, 如用户在某个程序活动时按了一下键盘,操 作系统马上能够感知到这一事件, 作系统马上能够感知到这一事件,并且能够知道 用户按下的是哪一个键, 用户按下的是哪一个键,操作系统并不决定对这 一事件如何作出反应, 一事件如何作出反应,而是将这一事件转交给应 用程序, 用程序,由应用程序决定如何对这一事件作出反 应。 对事件作出反应的过程就是消息响应。 对事件作出反应的过程就是消息响应。
Windows程序运行机制 Windows程序运行机制
这个参数到底有什么作用呢?如果想让我们 这个参数到底有什么作用呢? 的程序只能有一份实例运行, 的程序只能有一份实例运行,不能同时有多份实 例运行,我们可以在WinMain函数的开始部分加 例运行,我们可以在WinMain函数的开始部分加 上如下代码实现。 上如下代码实现。 if(hPrevInstance) return 0; 等效写法: 等效写法:if(hPrevInstance==1) return 0; 表示只要hPrevInstance不为 表示只要hPrevInstance不为NULL,说明已经有 不为NULL, 同样程序的实例在运行,WinMain函数将返回 函数将返回, 同样程序的实例在运行,WinMain函数将返回, 这样就保证了只有程序的一个实例可以运行。 这样就保证了只有程序的一个实例可以运行。在 程序中对应的是return 0语句 语句。 程序中对应的是return 0语句。
Windows程序运行机制 Windows程序运行机制
HWND hwnd: hwnd: 代表消息所属的窗口,一个消息一般都 代表消息所属的窗口, 是与某个窗口相联系的。 是与某个窗口相联系的。 UINT message: message: 代表消息代号, 代表消息代号,在程序中一般以 WM_xxx宏的形式来使用消息 WM_xxx宏的形式来使用消息。如鼠标移动 宏的形式来使用消息。 消息为WM_MOUSEMOVE,键盘按下消息 消息为WM_MOUSEMOVE,键盘按下消息 WM_KEYDOWN,输入一个字符消息为 为WM_KEYDOWN,输入一个字符消息为 WM_CHAR等等 WM_CHAR等等。 等等。
Windows程序运行机制 Windows程序运行机制
DWORD time: time: POINT pt: pt: 分别代表发出消息的时间和鼠标的当前 位置。 位置。
Windows程序运行机制 Windows程序运行机制