🦁

WindowsコンソールアプリケーションからShowWindow

2024/11/12に公開
1

VisualStudioで空のプロジェクトやコンソールアプリで開始したりしてもShowWindowを呼び出してウインドウを表示したい。

前提
プロジェクトのプロパティの[リンカー] > [システム] > [サブシステム]がコンソールになっている

重要なのはこの3つ

main.cpp
HINSTANCE hInstance = GetModuleHandle(nullptr);
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
int nCmdShow = SW_NOMAL;
ShowWindow(hWnd, nCmdShow);

ShowWindow()の第二引数は、リファレンスによるとWinMainから渡される値が必要らしいが無視して良い
SW_NOMALまたは、SW_SHOWNORMALで問題なく動作する

https://learn.microsoft.com/ja-jp/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlew
https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-showwindow

Discussion

YuneKichiYuneKichi

普通にCreateWindowとかすればウィンドウは作れますが……。

  • GetModuleHandleで取得できるのは「モジュールハンドル」
  • ShowWindowの第一引数は「ウインドウハンドル」

です。
モジュールハンドル(kernel32.dll由来)とウインドウハンドル(user32.dll/GDI由来)は別物なので、うまくいっても「たまたま」でしょう。