c++ - GetLastInputInfo() 阻塞一个函数

标签 c++ winapi event-handling

<分区>

我的主要功能是带有计时器的经典 Windows 消息循环:

int main()
{
    MSG msg;
    BOOL bRet;

    SetTimer(NULL, 0, 1000, (TIMERPROC) &MainLoop);
    while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
   {
     if(bRet == -1)
     {
         return -1;
     }
     else
     {
         TranslateMessage(&msg);
         DispatchMessage(&msg);
     }
   }
   return msg.wParam;
}

这是主循环:

void MainLoop() {
    PLASTINPUTINFO plii = NULL;

    cout << "in main loop" << endl;
    if(GetLastInputInfo(plii) == 0) { exit(-1); };
    cout << "in main loop 2" << endl;
}

第二条消息(“在主循环 2 中”)从不显示,但第一条消息每秒显示一次。是否存在 GetLastInputInfo() 不返回的原因?

最佳答案

GetLastInputInfo() 需要将扩展​​数据返回到结构中。由于生命周期和内存管理问题,它无法返回指向该结构的指针,因此您必须提供它。由于它需要修改结构,因此您必须提供结构的地址作为参数,即:

LASTINPUTINFO lli;
..
GetLastInputInfo(&lii);

由于此 API 的后续版本可能希望返回更多/扩展数据,因此该结构的第一个元素是“UINT cbSize;”必须设置为您提供的结构的大小的整数。这使得更高版本的 API 能够在需要时返回更多数据,同时仍然向后兼容早期版本,因此:

LASTINPUTINFO lli;
..
lii.cbSize=sizeof(LASTINPUTINFO);
GetLastInputInfo(&lii);

关于c++ - GetLastInputInfo() 阻塞一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28519041/

相关文章:

c++ - 从 STL 容器中 move 元素是否会将其从该容器中移除?

multithreading - 为什么即使在抢占式多任务操作系统 (Windows 7) 上线程也会饥饿

C++:如何将多个对象复制到剪贴板并在之后提取它们?

windows - 会有 Win64 API 吗?

Javascript ,事件处理程序总是被调用,即使事件没有引发

javascript - Jquery hide() 、 show() 函数不起作用

c++ - 具有多线程应用程序的 Nanomsg 非阻塞双向套接字

c++ - '系统' : a namespace with this name does not exist

c++ - parallel_for 中定义的变量范围

javascript - 在 JavaScript 中对事件处理程序使用粗箭头语法不起作用