#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
调用一样,正在对运行时环境进行外部更改:(
答案 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;
}