不调用任何与窗口相关的函数

时间:2012-08-20 18:35:39

标签: c++ visual-studio-2010 window

我的程序不需要任何窗口(它只需要文件I / O和一些计算),我试图让它尽可能小。我曾经在开头就拥有这一切:

WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = WindowProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.hbrBackground = NULL;
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("");
RegisterClass(&wc);
HWND hwnd = CreateWindow(TEXT(""),TEXT(""),0,0,0,0,0,HWND_MESSAGE,NULL,hInstance,NULL);

我把它拿出来,所以现在我的程序只是WinMain和没有窗口相关调用的有用东西。我还解除了user32.lib的链接。它似乎运行良好,但这是不好的做法/它会导致任何不可预见的问题吗?

3 个答案:

答案 0 :(得分:1)

最好是从“Win32控制台应用程序”开始,默认情况下,Visual Studio向导会向您提供一个根本不执行任何操作的简单应用程序:

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

正如您所看到的,Windows应用程序根本不需要来执行任何操作。这同样适用于GUI应用程序,如果这正是您所需要的(基本区别在于GUI项目不会在控制台窗口中启动)。虽然项目向导不一致地给你一堆乱七八糟的代码,但你可以安全地删除所有内容。一直到:

#include "stdafx.h"

int APIENTRY _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    return 0;
}

stdafx.h标头是预编译的标头,基本上相当于#include <windows.h>。但是由于预编译头的工作方式,您必须先包含stdafx.h。这是一个完全不同的话题,已在本网站上广泛报道。

答案 1 :(得分:-1)

不确定你删除了什么以及你离开了什么。如果留下了什么,那么将来可能会引起干扰。

请参阅此简单代码以Winmain

开头
#include <stdio.h>
#include <Windows.h>
#pragma comment(linker,"/SUBSYSTEM:WINDOWS") 

int _stdcall WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{

    return 0;

}

答案 2 :(得分:-1)

Win32窗口的最低要求。 http://www.codeproject.com/Articles/215690/Minimal-WinApi-Window

#include <windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{

 MSG msg          = {0};
 WNDCLASS wc      = {0}; 
 wc.lpfnWndProc   = WndProc;
 wc.hInstance     = hInstance;
 wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);
 wc.lpszClassName = L"minwindowsapp";
 if( !RegisterClass(&wc) )
   return 1;

 if( !CreateWindow(wc.lpszClassName,
                   L"Minimal Windows Application",
                   WS_OVERLAPPEDWINDOW|WS_VISIBLE,
                   0,0,640,480,0,0,hInstance,NULL))
    return 2;

    while( GetMessage( &msg, NULL, 0, 0 ) > 0 )
        DispatchMessage( &msg );

    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{

 switch(message)
 {
   case WM_CLOSE:
     PostQuitMessage(0);
     break;
   default:
     return DefWindowProc(hWnd, message, wParam, lParam);
 }
 return 0;

} 

更多读物:
http://msdn.microsoft.com/en-us/library/bb384843.aspx

http://groups.engin.umd.umich.edu/CIS/course.des/cis577/lecture/win.htm