创建不带窗口的应用程序
Create an Application without a Window
如何编程一个可以在不打开窗口或控制台的情况下运行的C/C++应用程序?
当您编写WinMain程序时,您会自动将/SUBSYSTEM选项设置为编译器中的窗口。(假设您使用Visual Studio)。对于任何其他编译器,可能存在类似的选项,但标志名称可能不同。
这导致编译器以可执行文件格式(PE格式)创建一个条目,将可执行文件标记为windows可执行文件。
一旦这些信息出现在可执行文件中,启动程序的系统加载程序就会将二进制文件视为windows可执行文件,而不是控制台程序,因此在运行时不会导致控制台窗口自动打开。
但是,如果不需要的话,windows程序不需要创建任何窗口,就像你在任务栏中看到的所有程序和服务一样,但看不到任何相应的窗口。如果你创建了一个窗口但选择不显示,也可能发生这种情况。
要实现这一切,你所需要做的就是
#include <Windows.h>
int WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int cmdShow)
{
/* do your stuff here. If you return from this function the program ends */
}
您需要WinMain本身的原因是,一旦您将子系统标记为Windows,链接器就会假设您的入口点函数(在程序加载和C Run TIme库初始化后调用)将是WinMain,而不是main。如果您不在这样的程序中提供WinMain,则在链接过程中会出现未解决的符号错误。
在窗口中:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// <-- Program logic here
return 0;
}
请务必使用Adam Mitz提到的/SUBSYSTEM链接器开关。
在其他平台上:
int main(int argc, char**argv)
{
// <-- Program logic here
return 0;
}
如果你需要在没有控制台或窗口的情况下连续运行程序,你可能会在*NIX或Windows上的服务上找到有用的deamon,这个.NET示例如果你需要普通的win32,只需在谷歌上搜索一点示例
由于你的问题被标记为win32,我认为服务对你来说更重要。
这也处理消息:
#include <windows.h>
#include <stdio.h>
int CALLBACK WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
MSG msg;
DWORD curThreadId;
curThreadId = GetCurrentThreadId();
// Send messages to self:
PostThreadMessage(curThreadId, WM_USER, 1, 2);
PostThreadMessage(curThreadId, WM_USER+1, 3, 4);
PostThreadMessage(curThreadId, WM_USER+2, 5, 6);
PostThreadMessage(curThreadId, WM_USER+3, 7, 8);
PostThreadMessage(curThreadId, WM_QUIT, 9, 10);
while (GetMessage(&msg, NULL, 0, 0)) {
printf("message: %d; wParam: %d; lParam: %dn", msg.message, msg.wParam, msg.lParam);
}
return (int) msg.wParam;
}
在Visual Studio Express 2010中,将子系统设置为windows(如用户17224所建议的)后,或者将main更改为WinMain(如用户172 24和Brian R.Bondy所建议的那样),可以在属性、链接器、高级、入口点中将entry函数设置为main:只需在文本框中键入main即可。
使用Visual Studio向导创建Win32应用程序。但不要创建窗口,即删除窗口创建功能。或者,我们可以创建Win Service应用程序。
如果使用MSVC或Visual Studio,请使用新的项目向导并选择控制台应用程序。
- 如何将一个窗口保留在另一个应用程序窗口的前面
- 在C++中获取应用程序窗口的大小
- 如何隐藏最大化和最小化按钮并在qml应用程序窗口中显示关闭按钮?
- 当电子的窗口隐藏时如何激活另一个应用程序窗口
- 如何在QT中获取背景应用程序窗口标题
- 您如何使用Winrt创建经典的Win32应用程序窗口
- 当模式窗口最小化时,最小化所有应用程序窗口(在 Linux 上)
- 更改 C++ 应用程序的应用程序窗口图标
- 仅从 EnumDesktopWindows 识别应用程序窗口
- 隐藏自定义应用程序窗口,但应在任务栏上显示应用程序图标(不是作为托盘图标)
- 如何在应用程序窗口中设置光标位置?(C )
- QT QML - 在 C++ 的现有应用程序窗口中显示一个矩形
- 如何通过QT 5.6设置QML应用程序窗口透明
- 打开不同的图像文件,并使用GDI 库在主应用程序窗口的背景上绘制它们
- 获取应用程序窗口的完整目录
- 在linux中动态地将应用程序窗口排列在一个又一个之上
- 在Gnome或KDE中以编程方式移动桌面上的应用程序窗口
- Qt5.6 RHEL全屏应用程序窗口和子窗口
- Visual Studio 2012应用程序窗口创建/调整大小与VS2008窗口创建不同?为什么?
- QtQuick2 无法将应用程序窗口关闭信号连接到方法(C++新手)