Windows API简单入门
2008-02-23 05:36:02来源:互联网 阅读 ()
用程式,这些可视化的编程环境提供了大量的类库和控件,但是在研发者享受方便的同时,
他们的手脚已不知不觉的受到了限制,有很多深入到Windows内部的操作他们无法完成,
为什么?因为所用的类库不支持。
事实上这些类库和控件都是架构在Window API的基础上面的,API即 Application
Programming Interface -- 应用编程接口 的缩写,他不但为应用程式所调用,同时也是
Windows的一部分,Windows自身的运行也调用这些API函数。要了解如何使用API就必须了
解一些Windows的运行机制。
简单地说,Windows是由事件驱动的抢占式多任务操作系统。事件驱动是相对于过程驱
动而言的,他改变了原来文档的顺序执行方式;Windows既然是多任务系统,就必须能同时
处理多个事件,系统为应用程式生成一个消息队列,消息在上面被张贴和发送,应用程式只
要从其消息队列中取出消息,然后一一执行就能够了。
现在,我将使用最最基本的范例程式 HelloWin 来说明WIN32 API的运行机制
首先,一个程式一定要有进入点,Win32 App的进入点函数的名称是WinMain,他的原型如下
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine,int nCmdShow)
hInstance是所谓的“实例句柄”,他是个数值,当程式在Windows下运行的时候,他被用
来唯一的标示这个程式,虽然用户可能同时运行多个同一个程式,即运行多个“实例”,我
们能够看到,每一个实例都有不同的hInstance值。
hPrevInstance,简单地说就是没用…他是存在于16位Windows程式中的,在编写
Windows 9x/NT/2000 程式的时候,总应该是NULL。
szCmdLine是个指针,指向一个以0为终结的字串,里面包含传给该程式的命令行参数,
假如想要让程式处理命令行,那么这个参数就有用了。
iCmdShow参数是个数值,指示窗口将如何被显示,这个数值由在Windows下运行该程式的
程式所决定,通常是SW_SHOWNORMAL。
接下来是注册一个窗口类,窗口总是从窗口类的基础上创建的,窗口类用以标示处理窗口消
息的窗口过程,注册窗口类时使用 RegisterClassEx() 函数,他只需要一个参数,一个指向
类型为 WNDCLASSEX 的结构指针。
具体注册初始是这样的:
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX); //结构的大小
wcex.style = CS_HREDRAW | CS_VREDRAW; //类风格
wcex.lpfnWndProc = (WNDPROC)WndProc; //窗口类的窗口过程
wcex.cbClsExtra = 0; //在类结构中预留的空间
wcex.cbWndExtra = 0; //在Windows内部保存的窗口结构中预留的空间
wcex.hInstance = hInstance; //程式的实例句柄
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_EXAMPLE); //程式图标
wcex.hCursor = LoadCursor(NULL, IDC_ARROW); //结构的大小
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW 1); //指定窗口的背景颜色
wcex.lpszMenuName = (LPCSTR)IDC_EXAMPLE; //菜单
wcex.lpszClassName = szWindowClass; //类名,和程式名相同
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); //也是程式图标
return RegisterClassEx(&wcex);
接下来,定义一个HWND,然后使用 CreateWindow() 函数,原型如下:
HWND CreateWindow(
LPCTSTR lpClassName, // 窗口类名
LPCTSTR lpWindowName, // 窗口标题
DWORD dwStyle, // 窗口风格
int x, // 初始x
int y, // 初始y
int nWidth, // 窗口宽
int nHeight, // 窗口高
HWND hWndParent, // 父窗口句柄
HMENU hMenu, // 菜单句柄
HINSTANCE hInstance, // 实例句柄
LPVOID lpParam // 创建参数
);
在 CreateWindow() 调用返回之后,Windows内部已创建了这窗口。但是窗口并为显示,
还需要两个调用,一个是 ShowWindow(hwnd, iCmdShow):第一个参数是刚刚创建的窗口
句柄,第二个参数是传递给WinMain的nCmdShow;另一个是 UpdateWindow(hwnd) ,导致
客户区域被绘制。
接下来,程式通过执行一块被称为“消息循环”的代码从消息队列中取出消息
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
消息循环以 GetMessage 开始,他从消息队列中取出一条消息,只要从消息队列中取出消
息的 Message 域不为 WM_QUIT,GetMessage 就返回一个非零值,否则将导致程式退出
消息循环,然后程式中止,返回 msg 结构的 wParam 参数。在循环中,TranslateMessage
将 msg 结构的内容进行修改,而 DispatchMessage 找出准备调用的窗口过程。
上面进行的仅仅是准备性工作:注册窗口类、创建窗口、显示窗口、进入消息循环取出消息
而实际的动作都发生在窗口过程中。
LRESULT CALLBACK WndProc(HWND hWnd, //刚刚创建的窗口句柄
UINT message, //得到的消息
WPARAM wParam,
LPARAM lParam //消息的进一步周详的参数
)
在程式中窗口过程通常是命名为 WndProc 的函数,其实窗口过程能够任意的命名,一个
Windows程式能够包含多个窗口过程,一个窗口过程总是和调用了 RegisterClassEx 注册的
窗口类相关联,CreateWindow 函数根据窗口类来创建窗口,但是个窗口类能够被用来创
建多个窗口。
消息收到之后,接下来应该根据消息的不同来进行处理
switch(message)
{
case …:
…
…
HelloWin程式只需要处理两条消息,即 WM_PAINT 和 WM_DESTROY。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: 用HOOK函数自动关闭IE广告窗口
下一篇: Windows中的消息周详列表
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash