我正在开发Win32应用程序。所有绘图都在WM_PAINT中完成。它工作正常。我在其中添加了一个功能。当我点击按钮时,执行命令提示符。我可以使用WinExec完成。现在当我移动Cmd.exe而不是在背景绘图中没有完成。 我用CreateProcess更新代码比发生同样的事情。任何人都可以帮我解决这个代码的错误。是因为当我专注于这个窗口时,焦点会被丢失并且没有完成绘图。
代码
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
TCHAR wchCmdPath[MAX_PATH];
memset(wchCmdPath,_T('\0'),MAX_PATH);
GetSystemDirectory(wchCmdPath,MAX_PATH);
wcscat(wchCmdPath,_T("\\cmd.exe"));
// Start the child process.
if( !CreateProcess( NULL, // No module name (use command line)
wchCmdPath, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi ) // Pointer to PROCESS_INFORMATION structure
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
// Close process and thread handles.
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
InvalidateRect(hwnd,NULL,TRUE);
UpdateWindow(hwnd);
提前致谢
答案 0 :(得分:4)
可能是因为WinExec
在生成的可执行文件调用GetMessage
时或在指定超时之前返回(请参阅:http://msdn.microsoft.com/en-us/library/ms687393(v=vs.85).aspx)。
这意味着在此之前,您的程序会停留在此行,因此不处理消息(包括WM_PAINT
)。 CreateProcess
没有这个问题,但你在等它吗?
答案 1 :(得分:0)
问题很可能在您发布的代码之外。您的InvalidateRect / UpdateWindow将在生成子进程后绘制一次窗口,但在稍后移动时它将不会处理重绘。
你需要解决的问题是“现在当我移动Cmd.exe而不是在背景绘图中没有完成”时,问题是在等待这个过程时考虑你在做什么。在等待进程时,您仍然需要处理传入的消息(至少WM_PAINT
一个)。
你不能使用WaitForSingleObject来等待进程,你需要使用一些能让你处理消息的函数,比如MsgWaitForMultipleObjects - 你的应用程序每次发送WM_PAINT时都需要重新绘制窗口,没有人会这样做它适合你。
另一种方法是不要等待进程,而是实现以事件驱动的方式处理其结果,就在主消息循环中(现在你可以将其视为“模态”进程,也许你可以重新考虑你的应用程序,使其“无模式”。)