一.应用层的api
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
intnCmdShow)
{
WNDCLASSEXwcex;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
RegisterClassEx(&wcex);
hWnd= CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0,CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
while(GetMessage(&msg, NULL, 0, 0))//NtUserGetMessage
{
// NtUserGetMessage目的是循环获取一个普通报文,
在这个循环中会检查被发送的报文,对方send过来的message会由NtUserGetMessage内部直接调用wndproc立即响应
//如果没有普通报文(post 硬件报文定时器报文等)就睡眠循环等待
if(!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);//键盘扫描码变成unicode
DispatchMessage(&msg);//对wndproc的调用
}
}
然后在WndProc函数中还能调用到SendMessage、PostQuitMessage等等函数
应用层消息的结构是
struct MSG
{
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
};
二.创建窗口NtUserCreateWindowEx
控件什么也都算window。
创建好的窗口对应的是window_object返回句柄。
Window_object里面包含了许多字段,里面就有用户填充的WndProc地址,消息队列结构
三.接收报文NtUserGetMessage
根据HWNDhWnd在全局句柄表中找到窗口