#!python # -*- mode: python; Encoding: utf-8; coding: utf-8 -*- # Last updated: <2025/12/26 22:58:47 +0900> """ pywin32でウインドウを新規作成してウインドウハンドル(HWND)を取得。 描画は何もしない。ウインドウの生成のみを行う。 Google Gemini で生成。 Windows11 x64 25H2 + Python 3.10.10 64bit """ import win32gui import win32con import win32api def wnd_proc(hwnd, msg, wparam, lparam): """ ウィンドウプロシージャ。ウィンドウに送られてくるイベント(メッセージ)を処理する関数 """ # ウィンドウが破棄される時の処理。閉じるボタンが押された等。 if msg == win32con.WM_DESTROY: print("WM_DESTROY 受信。メッセージループ(PumpMessages)終了信号を送る。") win32gui.PostQuitMessage(0) return 0 # 自分で処理しないメッセージは、OS提供のデフォルト処理に任せる return win32gui.DefWindowProc(hwnd, msg, wparam, lparam) def create_window(): # --- 1. ウィンドウクラスの定義 --- window_class_name = "MyPythonWindowClass" # ウィンドウの「型」となるクラス名 wc = win32gui.WNDCLASS() # ウィンドウの属性を設定する構造体 wc.lpfnWndProc = wnd_proc # メッセージ処理関数(コールバック)を登録 wc.lpszClassName = window_class_name # クラス名 # このウィンドウを実行しているアプリケーションのインスタンスハンドルを取得 wc.hInstance = win32api.GetModuleHandle(None) # 背景色を設定 wc.hbrBackground = win32gui.GetStockObject(win32con.WHITE_BRUSH) # マウスカーソルを標準矢印に設定 wc.hCursor = win32gui.LoadCursor(0, win32con.IDC_ARROW) # --- 2. ウィンドウクラスをOSに登録 --- try: # OSに「この設定のウィンドウを使います」と宣言 win32gui.RegisterClass(wc) except win32gui.error as e: # すでに登録済みの場合はエラー(1410)が出るため、それ以外の場合のみ例外を出す # http://ir9.jp/prog/ayu/win32err.htm if e.winerror != 1410: raise # --- 3. ウィンドウの生成 (HWNDの取得) --- # 成功すると、ウィンドウを操作するための「ハンドル(HWND)」が返却される hwnd = win32gui.CreateWindow( window_class_name, # 使用するクラス名 "Python Win32 Window Sample", # ウインドウタイトル # ウィンドウのスタイル(最小化・最大化ボタン等あり) win32con.WS_OVERLAPPEDWINDOW | win32con.WS_VISIBLE, win32con.CW_USEDEFAULT, # 出現位置 X座標 (OSにお任せ) win32con.CW_USEDEFAULT, # 出現位置 Y座標 (OSにお任せ) 512, # ウィンドウの幅 (ピクセル) 288, # ウィンドウの高さ (ピクセル) 0, # 親ウィンドウのHWND (なし) 0, # メニューのハンドル (なし) wc.hInstance, # インスタンスハンドル None, # 予備のデータ ) if not hwnd: print("Error : CreateWindow() は失敗") return None # --- 4. ウィンドウの可視化 --- # 作成直後のウィンドウは非表示なので明示的に表示を命令 print(f"CreateWindow() は成功。HWND : {hwnd}") win32gui.ShowWindow(hwnd, win32con.SW_SHOW) # ウィンドウの描画を即座に更新する win32gui.UpdateWindow(hwnd) return hwnd def main(): # ウィンドウの作成とHWNDの取得 main_hwnd = create_window() if main_hwnd: # --- 5. メッセージループ --- # Windowsから送られてくる「マウスが動いた」「キーが押された」などの # メッセージを絶えず受け取り、wnd_procに振り分ける無限ループ print("メッセージループ開始。") win32gui.PumpMessages() print("Pythonプロセスを終了。") if __name__ == "__main__": main()