为什么无法从Windows消息队列中打印

时间:2018-07-08 00:52:25

标签: c windows conemu

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

  MSG Msg;

  while (GetMessage(&Msg, NULL, 0, 0) > 0 ) {

    TranslateMessage(&Msg);

    printf("hello world \n");

    DispatchMessage(&Msg);
  }

(正在运行Windows 10 Creator的更新)

有人知道为什么这个prinf不起作用吗?

听起来像是琐碎的小事,但是我正在跨线程执行此操作,并且缺乏printf的能力使我完全不满意。我对为什么忽略我的标准输出以及Windows如何运行的内部细节感到非常好奇。

编辑1

我正在cmd.exe上运行程序-使用ConEmu

编辑2

这是构建脚本

C:\mingw64\mingw64\bin\gcc.exe -Wall -g -O2 -c -o main.o main.c

C:\mingw64\mingw64\bin\gcc.exe -Wall -g -shared -o main main.o

编辑3

令人困惑的是,如果您:

  printf("hello world 1 \n");

  while (GetMessage(&Msg, NULL, 0, 0) > 0 ) {

    printf("hello world 2\n");


    TranslateMessage(&Msg);

   DispatchMessage(&Msg);
  }

第一条消息hello world 1会打印,但第二条消息hello world 2不会!

就像Windows API调用一样,正在对运行时环境进行外部更改:(

1 个答案:

答案 0 :(得分:1)

GetMessage将等待来自与当前线程关联的窗口的窗口消息。如果没有消息或没有窗口,则等待是不确定的。

如果您确实有一个窗口并生成了消息,则将按预期方式调用printf。但是,您不应将printf放入消息循环中。而是在窗口过程中响应特定消息。

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
    switch (msg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, msg, wparam, lparam);
}

int main()
{
    printf("hello world 1 \n");

    WNDCLASSEX wcex = { sizeof(wcex) };
    wcex.lpfnWndProc = WndProc;
    wcex.lpszClassName = "classname";
    RegisterClassEx(&wcex);
    CreateWindow(wcex.lpszClassName, 0, WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
            0, 0, 300, 200, 0, 0, 0, 0);

    MSG Msg;
    while (GetMessage(&Msg, NULL, 0, 0) > 0 )
    {
        printf("hello world 2\n");//<- don't put anything here in the message loop
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return 0;
}