2013年9月8日日曜日

コンソールとウィンドウを表示するスケルトンプログラム。


 言い換えれば、「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 件のコメント:

コメントを投稿