[英]Create an Application without a Window
您將如何編寫無需打開窗口或控制台即可運行的C / C ++應用程序?
當您編寫WinMain程序時,會自動將/ SUBSYSTEM選項設置為編譯器中的Windows。 (假設您使用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,則在鏈接過程中將出現未解決的符號錯誤。
在Windows中:
#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;
}
在將子系統設置為Windows(如user17224所建議)后,在Visual Studio Express 2010中,除了將main更改為WinMain(如user17224和Brian R. Bondy所建議)之外,還可以在屬性,鏈接器,高級入口點:只需在文本框中輸入main。
使用Visual Studio向導創建Win32應用程序。 但是不要創建窗口,即刪除窗口創建功能。 或者,我們可以創建Win Service應用程序。
這也會處理消息:
#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: %d\n", msg.message, msg.wParam, msg.lParam);
}
return (int) msg.wParam;
}
如果您使用的是MSVC或Visual Studio,則只需使用新的“ 項目向導”,然后選擇“ 控制台應用程序” 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.