How to hide console window in Win32 API C? [duplicate] - c

This question already has answers here:
How to stop a program compiled with MinGW (g++) from opening a console window in windows
(2 answers)
Closed 8 years ago.
I want to hide the annoying console window which appears in GUI c programs while running.
For example, if I compile the following code:
#include <windows.h>
int WINAPI
WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR pszCmdLine, int iCmdShow)
{
MessageBox(NULL, "Hello world", "My program", MB_OK | MB_ICONEXCLAMATION);
return 0;
}
it will show a console window while running the program. Any help will be appreciated....
Thank you in advance....

Use /SUBSYSTEM:WINDOWS in the link step. Are you using Visual Studio and building a Console application? If you choose Windows Application it will use the right linker switch.

Related

Issues running WinMain in C

Currently I'm having issues with WinMain in C (specifically in Visual Studio).
For instance...
#include <stdio.h>
#include <Windows.h>
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, INT nCmdShow)
{
return(0);
}
1>------ Build started: Project: GameB, Configuration: Debug x64 ------
1>LIBCMTD.lib(exe_main.obj) : error LNK2019: unresolved external symbol main referenced in function "int __cdecl invoke_main(void)" (?invoke_main##YAHXZ)
1>E:\James\VisualStudio\CProjects\GameB\x64\Debug\GameB.exe : fatal error LNK1120: 1 unresolved externals
1>Done building project "GameB.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Just this basic set-up gives me an "inconsistent annotation for WinMain" warning. I have been searching for any help for 2 days and the the closest I come to an answer is people talking about WinMain in the context of C++. I have a feeling this is a problem with Visual Studio as I was originally just using VS Code and managed to get an app (one that generated a pop-up window) to compile and run.
You just set up your winmain wrong. This should work:
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);
or
INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR lpCmdLine, INT nCmdShow)
{
return 0;
}
Don't forget to #include <Windows.h> and change subsystem to windows.
To use the WinMain program entry point, you need to tell the linker to target the "Windows" subsystem, rather than building a console application. Otherwise, the linker will look for (and fail to find) the standard main entry point for C programs.
In the Solution Explorer, right-click on your project and select "Properties". Then navigate to the "Linker -> System" page and select "Windows (/SUBSYSTEM:WINDOWS)" as the target:
On your "inconsistent annotation" warning, see this Q/A: Inconsistent annotation for 'WinMain'
Also, as noted in the answer by SNO, you should add the WINAPI attribute to your WinMain function.
You need to set subsystem from Console to Windows in settings, by right clicking your project in the solution explorer, selecting properties, and going to Linker->System and setting SubSystem to Windows(/SUBSYSTEM:WINDOWS).

How can I avoid the Console while doing GUI with C?

Okay this is the sample code
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "A threat has been detected by Windows!!", "Warning!!", MB_OK);
return 0;
}
But whenever I compile this. It gives me a Message Box as ecpected but what I get more is the Command Prompt with it. I just don't want that ugly thing how can I modify or compile my code to get only the GUI ? I am using Code::Blocks IDE.
This is related to Code Blocks IDE, you have to change the type application in your project.
From the project properties, tab Build Targets, change the type console application to GUI application.
Check: http://forums.codeblocks.org/index.php?topic=12007.0

How to get rid of unwanted chinese characters? [duplicate]

This question already has answers here:
Why does my simple C++ GUI application show a message box in Chinese?
(3 answers)
Closed 9 years ago.
I am learning to create simple Windows applications and my first attempt is to create a pop-up with a message and ok button. I am doing this in C using visual C++ 2012. My issue is the window pops up but its header and the message is in chinese? I am doing everything in english so any idea why this is happening and how to fix??
FYI heres the code:
#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, "Hello", "Warning", MB_OK);
return 0;
}
Thanks
Change the call to this:
MessageBox(NULL, L"Hello", L"Warning", MB_OK);
A quick test (that produced compiler warnings C4133) showed the unexpected characters being displayed if you call MessageBoxW (the Unicode entrypoint) with non-Unicode strings.

Hello World (C and C++) for WinCE application - Visual Studio 2008

I'm a beginner for Visual Studio 2008 (32-bit). The WinCE version I'm using is 7.0 Evaluation. I created a new project as,
New Project -> Platform Builder-> OS Design
Selected the BSP as,
BSP: Generic CEPC:x86
When the design template highlighted Consumer Media Device, I just clicked Finish.
The above selections are a must for me. Besides these, I created a subproject as a simple hello world application and added a line cout<<"Hello World"; (as they are by default cpp files). I also included iostream.
I got errors such as,
fatal error C1083: Cannot open include file: 'iostream': No such file or directory
As stated in this link, I checked out for libcmtd.lib and it is in the $(VCInstallDir)lib. It is also included in Tools | Options | Projects and Solutions | VC++ Directories | Show Directories For -> Library files.
Based on this link, I checked the precompiled header settings. I found the following there:
Precompiled Files : Yes
Precompiled Header File Name : StdAfx.pch
Precompiled Header Object File Name : StdAfx.obj
Precompiled Header Options : (blank)
Precompiled Header Source File Name : StdAfx.h
How do I disable this? In case if I disable this, won't I get any other problems for the other part of the project?
Update:
For a C program,
#include<stdio.h>
int main()
{
printf("\nHello World\n");
return 0;
}
I got the following errors,
error LNK2019: unresolved external symbol _WinMain referenced in function _WinMainCRTStartupHelper
fatal error LNK1120: 1 unresolved externals
fatal error U1077: 'D:\WINCE700\sdk\bin\i386\x86\link.EXE' : return code '0x460'
What may be the linking problem here also?
The C code that you wrote, will not work in a WinCE app. The entry point for your WinCE app is WinMain, not regular main.
All that iostream stuff is from the STL. From my own experience there are some differences in how the STL is actually implemented on WinCE versus on Windows Desktop. That will be the source of issues now and in the future. Here's an SO article discussing these problems.
Here is how you might do it in WinCE (code not actually tested)
#include "stdafx.h"
using namespace std;
#include <iostream>
int WINAPI WinMain (
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow)
{
cout << "hello world" << endl;
return 0;
}
A Windows Application and a WinCE application follows different rules and needs different libraries than a console (CRT) app. In your Visual Studio, create a default Win32 project and create a default console app. Then compare the project files between all three in a text compare tool. You'll see many differences. These differences include at least the following:
A different entry point -- WinMain, _WinMain, _tWinMain, etc
They enable use of the windows.h file and all the related apparatus
A different set of default .lib files you must link to
Despite all of this, WinCE apps get fun when you get into the GUI stuff. If I were you, I'd get out of this C++ stuff and get into the C# Compact Framework.
When you want to write a main(argc, argv) style program you must choose console application in the project wizard.
It's not possible to use cout or printf statements in these kind of WinCE applications as 010110110101 said.
Instead, for displaying text, we shall use DEBUGMSG or RETAILMSG based on the build mode.
DEBUGMSG(TRUE,(TEXT("Hello World")));
RETAILMSG(TRUE,(TEXT("Hello World")));
For example, DEBUGMSG won't work in Release mode. The syntax for these messages is in this link.

GCC / C how to hide console window?

****C newbie alert**** How do I compile a C app so that it runs without showing a console window on Windows? I'm using Windows XP and GCC 3.4.5 (mingw-vista special r3). I've googled this exhaustively and I've come up with the following which, according to what I've read, sounds like it's supposed to do the trick, but doesn't on my system:
#include <windows.h>
#include <stdlib.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
system("start notepad.exe");
}
I've also tried passing the "-mwindows" argument to GCC to no avail. The code sample launches Notepad but still flashes up a command prompt.
EDIT: FWIW I have also tried ShellExecute as an alernative to system(), although I would be happy to even get an app with an empty main() or WinMain() working at this point.
Retain the -mwindows flag and use this:
#include <windows.h>
#include <process.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
execl("c:\\winnt\\system32\\notepad.exe", 0);
// or: execlp("notepad.exe", 0);
}
Note: you need the full path for the execl() call but not the execlp() one.
Edit: a brief explanation of why this works - using system() starts a shell (like cmd.exe) to exec the command which produces a console window. Using execl doesn't.

Resources