Windows:
是否可以在没有任何Console或GUI显示的情况下在后台执行C ++程序?而且,怎么样?
如何在计算机关闭之前进行处理?
如果在此程序处于活动状态时如何维护正在执行的功能,请
IDE:Visual Studio 2013
答案 0 :(得分:18)
第1步:如果您使用的是IDE,那么在项目创建过程中,它很可能会询问“console-app”与“window-app”。选择window-app,这意味着它将在不打开控制台的情况下启动。
第2步:现在,您的IDE可能会在代码中生成一些使Window可见的代码。删除该代码:
您的程序现在正在运行,但在任务栏上看不到:。
要运行自己的代码,您有2个选项。哪个适合取决于您的情况,但第二个通常是首选:
使用WinMain之类的生成方法之一启动自己的方法,该方法应该包含一个循环,并在该循环中使用代码加上对Sleep()的调用。
使用windows-messages按需运行部分代码。 (的优选强>)
程序将一直运行,直到您的计算机关闭;然后它将不再运行。
关于何时使用选项1与选项2的几点说明:
选项2 通常被认为更好,因为它与操作系统(Windows)一起工作,它只在操作系统告诉它发生了某些变化时执行代码。另一方面,选项1 不依赖于Windows消息 - 有时您需要这种独立性。它的代价是:你的代码可能会“手动”检查是否有变化,有时会做某事,但大部分时间都选择Sleep()。这被称为->polling btw。所以更喜欢选项2。
这就是如何修改选项2-apps的WndProc 。示例:每秒发出一声哔声。
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
#define IDT_TIMER1 123 // todo find out which numbers are allowed
// which depends on windows AND your organization
case WM_CREATE:
SetTimer(hWnd, IDT_TIMER1, 1000, (TIMERPROC) NULL);
break;
case WM_TIMER:
switch (wParam) {
case IDT_TIMER1:
Beep(100,50);
break;
}
break;
case WM_COMMAND:
...
答案 1 :(得分:2)
为此,您需要隐藏窗口。
对于控制台:ShowWindow (GetConsoleWindow(), SW_HIDE);
对于Win32项目:要么不使用CreateWindow
或CreateWindowEx
创建窗口,要么ShowWindow(hWnd, SW_HIDE)
或者是最佳解决方案,您可以创建服务some sample
答案 2 :(得分:0)
这是隐藏窗口的方法:
void main() {
HWND window;
AllocConsole();
window = FindWindowA("ConsoleWindowClass", NULL);
ShowWindow(window, 0);
//close program when Esc pressed
if (GetAsyncKeyState(VK_ESCAPE) & 0x8000) {
return 0;
}
}