=begin ★Win32API:実験&勉強スクリプト★ RGSS上でWin32APIの機能を使うべく書き溜めたやつ。 ちゃんと動作しないメソッドもあります。 以下は使用法の一例。 ● メッセージボックス ●============================================ 選択肢なしの確認コマンド R_Win32API_Test.message_box(message, title) -------------------------------------------------------------------- 選択肢ありの確認コマンド R_Win32API_Test.confirm_message(message, title) -------------------------------------------------------------------- 選択肢ありの確認コマンドではbool型の返り値が返ってくる為、 条件分岐内で使用することができます。 例: if R_Win32API_Test.confirm_message("よろしいですか?", "確認") -------------------------------------------------------------------- どちらのメッセージ内にも、改行文字列"\n"が有効です。 ==================================================================== ● Windowsの通知サウンドの再生 ●=================================== R_Win32API_Test.wss_play([type]) -------------------------------------------------------------------- typeには0~3のいずれかの数値を入れてください。 それぞれに対応したサウンドが演奏されます。 ==================================================================== ● マウスカーソルを隠す ●========================================== R_Win32API_Test.invisible_cursol ==================================================================== ● キーボード操作 ●================================================ R_Win32API_Test.key_input(keyCode[, type]) -------------------------------------------------------------------- 対応したkeyCodeを指定。詳細はスクリプト内にて。 ==================================================================== ● 多重起動の防止 ●================================================ メインセクションの上に以下の処理を追加 -------------------------------------------------------------------- unless $! if R_Win32API_Test.check_mutex.zero? R_Win32API_Test.create_mutex else exit end end ==================================================================== ● ゲームウィンドウ最大化ボタンを有効 ●============================ R_Win32API_Test.change_wondow_style ==================================================================== ● ゲームウィンドウサイズの変更 ●================================== R_Win32API_Test.resize_window(width, height) ==================================================================== Last Update : 2010/12/23 12/23 : 新規 ろかん   http://kaisouryouiki.web.fc2.com/ =end module R_Win32API_Test #-------------------------------------------------------------------------- # ● 文字コード変換 #-------------------------------------------------------------------------- def self.encord_text(text, type = 0) case type when 0 ; encord = "-s" # Shift JIS when 1 ; encord = "-e" # EUC-JP when 2 ; encord = "-w" # UTF-8 end return NKF.nkf(encord, text) end #-------------------------------------------------------------------------- # ● ゲームタイトル取得 #-------------------------------------------------------------------------- def self.get_title name = "\0" * 256 readini = Win32API.new("kernel32", "GetPrivateProfileStringA", "pppplp", "l") readini.call("Game","Title", "", name, 255, ".\\Game.ini") return name.delete!("\0") end #-------------------------------------------------------------------------- # ● ゲームウィンドウハンドル取得 #-------------------------------------------------------------------------- def self.get_main_handle window = Win32API.new("user32", "FindWindowA", "pp", "l") return window.call("RGSS Player", get_title) end #-------------------------------------------------------------------------- # ● システムメニューのハンドルを取得 #-------------------------------------------------------------------------- def self.get_system_handle system = Win32API.new("user32", "GetSystemMenu", "li", "l") return system.call(get_main_handle, 0) end #-------------------------------------------------------------------------- # ● ウィンドウ情報の取得 #-------------------------------------------------------------------------- # 引数:data => 取得してくる情報 #-------------------------------------------------------------------------- # -4 => ウィンドウプロシージャのアドレス # -6 => アプリケーションのインスタンスハンドル # -16 => ウィンドウスタイル #-------------------------------------------------------------------------- def self.get_window_long(data) long = Win32API.new("user32", "GetWindowLongA", "li", "l") return long.call(get_main_handle, data) end #-------------------------------------------------------------------------- # ● ウィンドウの状態を変更 #-------------------------------------------------------------------------- # 引数:type => 行う動作の種類 #-------------------------------------------------------------------------- # 0 => アンアクティブ、非表示化 # 1 => アクティブ化 # 2 => アクティブ化、最小化 # 3 => アクティブ化、最大化 # 4 => アクティブにはせず、表示 # 5 => 通常表示 #-------------------------------------------------------------------------- def self.show_window(type) active = Win32API.new("user32", "ShowWindow", "pi", "i") active.call(game_window_handle?, type) end #-------------------------------------------------------------------------- # ● ウィンドウサイズ変更 #-------------------------------------------------------------------------- def self.resize_window(width, height) resize_window = Win32API.new("user32", "SetWindowPos", "lllllll", "i") resize_window.call(get_main_handle, 0, 0, 0, width, height, 2) end #-------------------------------------------------------------------------- # ● マウスカーソルを隠す #-------------------------------------------------------------------------- def self.invisible_cursol cursol = Win32API.new("user32", "SetClassLongA", "lil", "l") cursol.call(get_main_handle, -12, 0) end #-------------------------------------------------------------------------- # ● システムメニューから項目を削除 #-------------------------------------------------------------------------- # メニューから削除した項目はchange_wondow_styleで有効にしていても無効となる #-------------------------------------------------------------------------- def self.delete_system_menu(*index) delete = Win32API.new("user32", "DeleteMenu", "lii", "l") index.each{|i| delete.call(get_system_handle, i, 0x00000400)} end #-------------------------------------------------------------------------- # ● ウィンドウスタイルの変更 #-------------------------------------------------------------------------- def self.change_wondow_style(type = 0) # flag # 0x00010000 => 最大化許可 # 0x00040000 => サイズ変更許可 flag = type.zero? ? 0x00010000 : 0x00040000 style = Win32API.new("user32", "SetWindowLongA", "lil", "l") style.call(get_main_handle, -16, get_window_long(-16)|flag) end #-------------------------------------------------------------------------- # ● キーボード操作 #-------------------------------------------------------------------------- # 引数:keyCode #-------------------------------------------------------------------------- # ESC => 0x1B , ← => 0x25 # ALT => 0x12 , ↑ => 0x26 # ENTER => 0x0D , → => 0x27 # SPACE => 0x20 , ↓ => 0x28 # PAGEUP => 0x21 , A => 0x41 # PAGEDOWN => 0x22 , D => 0x44 # F1 => 0x70 , Q => 0x51 # F4 => 0x73 , S => 0x53 # F5 => 0x74 , W => 0x57 # F6 => 0x75 , X => 0x58 # F7 => 0x76 , Z => 0x5A # F8 => 0x77 , CTRL => 0x11 # F9 => 0x78 , SHIFT => 0x10 #-------------------------------------------------------------------------- def self.key_input(keyCode, type = 0) key = Win32API.new("user32", "keybd_event", "llll", "") if type.zero? # 押すと離すを共に行う key.call(keyCode, 0, 0x0000, 0) key.call(keyCode, 0, 0x0002, 0) else # 同時押しを行う場合はこっち key.call(keyCode, 0, type == 1 ? 0x0000 : 0x0002, 0) end end #-------------------------------------------------------------------------- # ● メニューバーのハンドルを取得(存在しない場合は新規作成を行う) #-------------------------------------------------------------------------- def self.get_menu_handle menu_handle = Win32API.new("user32", "GetMenu", "l", "l") if menu_handle.call(get_main_handle).zero? set = Win32API.new("user32", "SetMenu", "ll", "l") creat = Win32API.new("user32", "CreateMenu", "v", "l") set.call(get_main_handle, creat.call) end return menu_handle.call(get_main_handle) end #-------------------------------------------------------------------------- # ● メニューバーに項目を追加 #-------------------------------------------------------------------------- def self.add_menu(text, id) add = Win32API.new("user32", "AppendMenuA", "lipp", "i") add.call(get_menu_handle, 0, id, encord_text(text)) redrow_menu end #-------------------------------------------------------------------------- # ● メニューバーの再描画 #-------------------------------------------------------------------------- def self.redrow_menu drow = Win32API.new("user32", "DrawMenuBar", "l", "i") drow.call(get_main_handle) end #-------------------------------------------------------------------------- # ● ステータスバーの生成 #-------------------------------------------------------------------------- def self.status_bar(text) status = Win32API.new("comctl32", "CreateStatusWindowA", "lplp", "l") status.call(0x40000000|0x10000000|0x0100, encord_text(text), get_main_handle, "status") end #-------------------------------------------------------------------------- # ● クライアント領域再描画 #-------------------------------------------------------------------------- def self.update_window redrow = Win32API.new("user32","UpdateWindow","l","l") redrow.call(get_main_handle) end #-------------------------------------------------------------------------- # ● スクリーンセーバーの実行 #-------------------------------------------------------------------------- def self.screensaver desktop = Win32API.new("user32", "GetDesktopWindow", "", "l") screen = Win32API.new("user32", "SendMessage", "llll", "l") screen.call(desktop.call, 274, 0xf140, 0) end #-------------------------------------------------------------------------- # ● ミューテックスオブジェクトを作成 #-------------------------------------------------------------------------- def self.create_mutex(objyect_name = get_title) mutex = Win32API.new("kernel32", "CreateMutexA", "iip", "l") mutex.call(0, 0, objyect_name) end #-------------------------------------------------------------------------- # ● ミューテックスオブジェクトの検査 #-------------------------------------------------------------------------- def self.check_mutex(objyect_name = get_title) mutex = Win32API.new("kernel32", "OpenMutexA", "lip", "l") return mutex.call(0x001F0001, 0, objyect_name) end #-------------------------------------------------------------------------- # ● ウィンドウズエラーサウンドの演奏 #-------------------------------------------------------------------------- def self.wss_play(type = 0) case type when 0 ; ese = 0x00000000 # 一般の警告音 when 1 ; ese = 0x00000010 # システムエラー when 2 ; ese = 0x00000030 # メッセージ(警告) when 3 ; ese = 0x00000040 # メッセージ(情報) end sound = Win32API.new("user32", "MessageBeep", "i", "i") sound.call(ese) end #-------------------------------------------------------------------------- # ● 確認メッセージボックス #-------------------------------------------------------------------------- def self.confirm_message(message, title) type = 0x00000004|0x00000100|0x00000020 messagebox = Win32API.new("user32", "MessageBoxA", "pppi", "i") return (messagebox.call(get_main_handle, encord_text(message), encord_text(title), type) == 6) end #-------------------------------------------------------------------------- # ● 通常メッセージボックス #-------------------------------------------------------------------------- def self.message_box(message, title) type = 0x00000000|0x00000040 messagebox = Win32API.new("user32", "MessageBoxA", "pppi", "i") messagebox.call(get_main_handle, encord_text(message), encord_text(title), type) end end