Win32k(2) 报文驱动的通信机制

本文探讨Win32k系统中的报文驱动通信机制,包括应用层API如WndProc函数,消息结构,接收报文过程如NtUserGetMessage,以及发送报文的PostMessage和SendMessage详情。讲解了消息如何在窗口对象、消息队列和线程间传递,并涉及到窗口过程和消息钩子的调用。
摘要由CSDN通过智能技术生成

一.应用层的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在全局句柄表中找到窗口

 

首先,你需要连接你的STM32K210板与电脑进行串口通信。你可以通过USB转串口模块或者其他串口调试工具进行连接。接下来,你可以按照以下步骤进行串口通信的配置和编程: 1. 配置GPIO口为串口通信功能。根据你选择的串口口号和波特率,配置对应的GPIO口。 2. 配置USART外设。使用STM32 HAL库中的USART_Init函数进行配置,包括波特率、数据位、校验位、停止位等参数。 3. 使能串口接收中断。使用USART_ITConfig函数使能串口接收中断,并在中断处理函数中读取接收到的数据。 4. 使用USART_Transmit函数发送数据。通过USART_Transmit函数向串口发送数据。 下面是一个示例代码,可以实现STM32K210的串口通信: ```c #include "stm32k210xx.h" #include "stm32k210_hal.h" #define USART_TX_PIN GPIO_PIN_2 #define USART_RX_PIN GPIO_PIN_3 #define USART_GPIO GPIOA #define USART USART2 void USART2_IRQHandler(void) { if(USART->ISR & USART_ISR_RXNE) //接收到数据 { uint8_t data = USART->RDR; //读取接收到的数据 //TODO: 处理接收到的数据 } } int main(void) { //配置GPIO口为串口功能 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = USART_TX_PIN | USART_RX_PIN; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(USART_GPIO, &GPIO_InitStruct); //配置USART外设 USART_InitTypeDef USART_InitStruct = {0}; USART_InitStruct.BaudRate = 115200; USART_InitStruct.WordLength = USART_WORDLENGTH_8B; USART_InitStruct.StopBits = USART_STOPBITS_1; USART_InitStruct.Parity = USART_PARITY_NONE; USART_InitStruct.Mode = USART_MODE_TX_RX; USART_InitStruct.CLKPolarity = USART_POLARITY_LOW; USART_InitStruct.CLKPhase = USART_PHASE_1EDGE; USART_InitStruct.CLKLastBit = USART_LASTBIT_DISABLE; USART_Init(USART, &USART_InitStruct); //使能串口接收中断 USART_ITConfig(USART, USART_IT_RXNE, ENABLE); NVIC_EnableIRQ(USART2_IRQn); //启动USART USART_Cmd(USART, ENABLE); while(1) { //发送数据 uint8_t data = 0x55; USART_Transmit(USART, data); } } ``` 在上面的代码中,我们配置了USART2口作为串口通信,并设置了波特率为115200。在主循环中,我们通过USART_Transmit函数向串口发送数据。在USART接收到数据时,会触发串口接收中断,并在中断处理函数中读取接收到的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值