如何阻止屏幕截图制作控制台程序?

时间:2012-10-30 16:18:00

标签: c++ console-application screenshot windows-console

我有code to make a screenshot,但这是我的程序产生的内容:

screenshot with control program blocking some of the screen http://imageshack.us/a/img27/7387/71240043.png

我的程序控制台弹出并阻碍。这是一个瞬间弹出窗口,因为程序会在瞬间双击屏幕截图。

我做了一些搜索有关如何隐藏它的信息,并找到了a forum with the following recommendation

  

在目标选项中将应用程序类型从“控制台”更改为“GUI应用程序”(项目属性 - >选项卡“构建目标”)。

但是将它设置为GUI应用程序并没有摆脱分秒控制台。

我尝试使用隐藏控制台的代码,并找到了an example

HWND hWnd = GetConsoleWindow();
ShowWindow( hWnd, SW_HIDE );

但是,编写隐藏控制台的代码仍会弹出控制台,并在显示的瞬间阻止屏幕截图。

如何阻止控制台出现在瞬间出现?如果控制台只是最小化,我不会感到困扰,只要它不会阻挡镜头。

3 个答案:

答案 0 :(得分:3)

我不认为只是切换类型就足够了,因为您还需要将入口点格式main更改为WinMain。看看这个如何构建无窗口应用程序(http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/82f506c4-ac1f-48c1-a5dc-51bfe99cf850)的示例,我建议创建一个新的Win32项目,然后复制你拥有的代码。

答案 1 :(得分:1)

使用鲁道夫的建议,我做了研究,可以专门回答这个问题:

int main()更改为int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)。 (更正)这仅在设置为图形时才有效。

要解决无法访问int main的{​​{1}} / argc选项的问题,请使用argv__argc,这是一个__argv中找到的外部变量。

另见http://support.microsoft.com/kb/126571

答案 2 :(得分:1)

Hacky,但是......隐藏窗口之后你可以延迟足够长的时间让它在屏幕上生效。在这里,我使用C ++ 11(#include <thread>用于this_thread,#include <chrono>用于毫秒),因此您需要使用VS2012来使用这个确切的代码来延迟。

HWND console = GetConsoleWindow();
if (!console)
    ; // handle error
BOOL was_visible = ShowWindow(console, SW_HIDE);

// delay for a fraction of a second...
std::this_thread::sleep_for(std::chrono::milliseconds(100));

// ... take screen shot

if (was_visible)
    ShowWindow(console, SW_SHOW);