コンソールとウィンドウを表示するスケルトンプログラム。
言い換えれば、「Windowsアプリケーションからコンソールを表示する方法」です。
プログラムを組んでいるとWindowsアプリケーションであってもコンソールを使いたい場合があります。そこで、コンソールを表示させようかと思いました……。
参考にしたURL
http://www.wgag.net/winapi/0012.html
http://dixq.net/forum/viewtopic.php?f=3&t=3602
http://blogs.yahoo.co.jp/tx_b19_89_ta/19629287.html
まず一番上のURLからいつも通りWindowsアプリケーションのサンプルプログラムを拝借してきます。次に二番目のURLを参考にコードを9行ほど追加します。最後に三番目のURLを参考にバグを潰しました。
以下、サンプルコードです。
//==========================================================
#include <tchar.h>
#include <windows.h>
#include <stdio.h>//printfに必要
const TCHAR szWndClass[] = _T("TestProgram");
LRESULT CALLBACK WndProc(
HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
// The entry point for the application
int WINAPI WinMain(
HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
wc.lpszMenuName = NULL;
wc.lpszClassName = szWndClass;
if (!RegisterClass(&wc)) return FALSE;
HWND hWnd = CreateWindow(
szWndClass, _T("Title"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL,
hInstance, NULL);
if (!hWnd) return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
//書き足した部分■■■■■■■■■
AllocConsole();//コンソールを表示するための一行。一応プログラム終了時にコンソールを非表にしている
FILE *console;
freopen_s(&console,"CONOUT$", "w", stdout);//printfを使えるようにする一行
freopen_s(&console,"CONIN$", "r", stdin);//scanf_sを使えるようにする一行
printf("文字を入力してください\n");
char buff[1024];
scanf_s("%s",buff,1024);//scanfをそのまま置き換えて「scanf_s("%s",buff);」と書いてもコンパイルエラーにはならないが、「scanf_s("%s",buff,1024);」とバッファのサイズを指定しないと表示されない。
printf("\n\n\n%s\n",buff);
//■■■■■■■■■■■■■■■■
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//書き足した部分■■■■■■■■■
FreeConsole();//コンソールの消去
//■■■■■■■■■■■■■■■■
return (int) msg.wParam;
}
// Processes messages for the main window
LRESULT CALLBACK WndProc(
HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
0 件のコメント:
コメントを投稿