簡體   English   中英

創建沒有窗口的應用程序

[英]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;
}

如果您需要在沒有控制台或窗口的情況下連續運行程序,則可能會在* NIXWindows 上的 服務中找到有用的守護進程 ,如果您需要普通的win32,則此.NET示例僅需一點點Google搜索即可。
由於您的問題標記為win32,因此我認為服務與您更相關。

在將子系統設置為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;
} 

如果您使用的是MSVCVisual Studio,則只需使用新的“ 項目向導”,然后選擇“ 控制台應用程序”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM