在Windows端经常会使用到一些带界面的工具,但在实现自动化的时候对这些工具的自动化如果使用位置点击的方式,那么自动化的稳定性不太好,并且实现起来也不方便,除了界面点击的方式是否还有其它更简单、稳定的方式呢?今天就介绍一种通过消息操作界面的方法。
Windows系统是建立在事件驱动的机制上的,通过消息的传递来实现的,消息提供了应用程序之间、应用程序与windows 系统之间进行通信的手段。
Windows窗口
窗口是位于屏幕中的一个区域,它用于接收用户的输入,然后以文本或图形的形式显示输出。比如一个应用程序,一般都是以图形界面的形式展示,这个图形界面就是应用程序的窗口,其中可能还包括工具栏、按钮、滚动条、输入框等等,这些也是窗口,通常被称为“子窗口”或“控件窗口”或“子窗口控件”。
HELLOWIN.C/*--------------------------------------------------------------------------------------------
HELLOWIN.C——Displays“Hello, Windows 98!”in client area(c) Charles Petzold, 1998
---------------------------------------------------------------------------------------------*/# include < windows.h >LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{static TCHAR szAppName [] = TEXT (" HelloWin ");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;//窗口类wndclass.style = CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon (NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.hbrBackground=(HBRUSH) GetstockObject (WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszclassName= szAppName;if (!RegisterClass (&wndclass)) //窗口类的注册{
MessageBox (NULL, TEXT(“This program requires Windows NT !*”),SzAppName, MB_ICONERROR);return 0;
}//窗口的创建hwnd = CreateWindow ( szAppName,//窗口类名TEXT(“Hello程序”),//窗口标题WS_OVERLAPPEDWINDOW,//窗口风格CW_USEDEFAULT,// x的初始位置CW_USEDEFAULT,// y的初始位置CW_USEDEFAULT,//初始x大小CW_USEDEFAULT,//初始y大小NULL,//父窗口句柄NULL,//窗口菜单句柄hInstance,//程序实例句柄NULL);//创建参数ShowWindow (hwnd, iCmdShow); //窗口的显示Updatewindow (hwnd); //窗口客户区重绘//消息循环,从消息队列中获取消息while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}return msg.wParam;
}//窗口过程,决定了窗口客户区的显示内容以及窗口如何对用户的输入做出响应。即消息的处理。LRESULT CALLBACK WndProc (HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;switch(message)
{case WM_CREATE:
PlaySound (TEXT (" hellowin .wav"), NULL, SND_FILENAME I SND_ASYNC); return 0;case MWM_PAINT:
hdc = BeginPaint (hwnd, &ps);
GetClientRect (hwnd,&rect);
Drawtext (hdc, TEXT("Hello, Windows 98 !”), -1, &rect ,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint (hwnd, &ps);
return0;
case MWM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefwindowProc (hwnd, message, wParam, lParam);
}
• 系统消息队列
• 应用程序消息队列
发生事件时,Windows先将触发的消息放入系统消息队列,之后根据消息的 hwnd 值将消息复制到相应的应用程序消息队列,接着应用程序中的消息循环在其消息