كود:
=begin rdoc
= #027 Win32API インタプリタ
== 概要
Win32APIの機能を利用するスクリプトの共通モジュールです。共通する動作をこの
スクリプトにまとめて、機能の不具合の発生を最低限に抑える役割を果たします。
== 注記事項
* Win32API に依存します。動作するPCの機種によってごく稀に予測できない不具合が
生じる場合があります。
* 設定・動作の詳細は設定セクションの[設定・動作について]をご覧下さい。
== このスクリプトの情報
バージョン:: 2.0.1
対応:: RPGツクールXP, RPGツクールVX(共通)
配布元:: http://quiet-labs.net/s/027/
作成者:: ユミル ( mailto:info@quiet-labs.net )
挿入位置:: [VX / XP] 常に一番上に挿入してください
動作条件:: [VX / XP] 特になし
==サポート
* 不具合などがありましたら掲示板で報告していただければ幸いです。
* 設定や組み込みなどで不明な点が有れば掲示板にてお尋ね下さい。
== 更新履歴
[2.1.0]
更新 : 2008-04-02
* Windows の環境変数を取得するメソッドを追加。
[2.0.0]
更新 : 2007-12-29
* RPGツクールVX に対応。
* #023「文字列エンコード変換」を吸収し、仕様を変更。
* スクリプト全体の改良。
[1.0.1]
更新 : 2007-09-01
* DLL のファイル名に関するバグを修正。
* 一部のコメントを追記。
[1.0.0]
更新 : 2007-08-27
* 公開。
=end
# このサイトの名前空間。
module QuietLab
end
# このスクリプトの名前空間。
module QuietLab::Script_27
# このスクリプトのバージョンの日付表記。
Version = 2008_04_02
end
# Win32API を操作するモジュール。
module QuietLab::Win32API
@@apis = {}
module_function
# 呼び出されたメソッドが定義されていなかった時、インタプリタがこの
# メソッドを呼び出します。
def method_missing(name, *param)
return @@apis[name].call(*param) if @@apis[name]
super(name, *param)
rescue => exp
# バックトレースを調整するために例外を書き替え
exp.backtrace.shift
raise(exp.class, exp.message, exp.backtrace)
end
# API 関数を定義します。引数は Win32API.new と同じです。
def define_api(dllname, proc, import, export)
key = sprintf('%s_%s', dllname.split('.', 2)[0], proc).intern
return if @@apis[key]
@@apis[key] = Win32API.new(dllname, proc, import, export)
end
define_api('user32', 'FindWindow', 'pp', 'i')
define_api('kernel32', 'GetPrivateProfileString', 'pppplp', 'l')
define_api('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
define_api('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
define_api('kernel32', 'ExpandEnvironmentStrings', 'ppl', 'l')
# RGSS のバージョン情報を持つ配列を返します。
# [ 0 : DLL ファイル名, 1 : バージョン(長さ 3 の文字列), 2 : 言語( J/E ) ]
def version_data
buffer_size = 16
buffer = "\0" * buffer_size
size = kernel32_GetPrivateProfileString \
("Game", "Library", '', buffer, buffer_size, '.\\Game.ini')
buffer.delete!("\0")
buffer.match(/^RGSS(\w{3})([A-Z]).dll$/).to_a
end
# RGSS のバージョンを返します。返り値は Float です。
def rgss_version
version_data[1].to_i / 100.0
end
# RGSS の動作言語を返します。返り値は Symbol です。
def rgss_language
case version_data[2]
when 'E' : Language::English
when 'J' : Language::Japanese
end
end
# ゲームの名前を返します。文字列は Shift_JIS エンコードです。
def game_name_sj
buffer_size = 256
buffer = "\0" * buffer_size
size = kernel32_GetPrivateProfileString \
("Game", "Title", '', buffer, buffer_size, '.\\Game.ini')
buffer.delete("\0")
end
# ゲームの名前を返します。。
def game_name
convert_encoding(game_name_sj, Encoding::Shift_JIS, Encoding::Default)
end
# メインウィンドウのウィンドウハンドルを返します。
def get_window_handle
window_name = case rgss_version.to_i
when 1 : "RGSS Player"
when 2 : "RGSS2 Player"
end
user32_FindWindow(window_name, game_name)
end
# 文字列に含まれる環境変数の指定を、その値に置き換えます。
def get_env_string(format)
# フォーマットのパス中の / を \ に統一する
format = format.gsub(/\//, '\\')
# データの取得
buffer_size = 256
buffer = "\0" * buffer_size
kernel32_ExpandEnvironmentStrings(format, buffer, buffer_size)
buffer.delete!("\0")
buffer
end
end
# 言語定数を保持するモジュール。
module QuietLab::Win32API::Language
Japanese = :Japanese
English = :English
end
# エンコーディング定数を保持するモジュール。
module QuietLab::Win32API::Encoding
# UTF-8 のコードページ。
UTF_8 = 65001
# Shift_JIS ( MS932 ) のコードページ。
Shift_JIS = 932
# EUC-JP のコードページ。
EUC_JP = 20932
# iso-8859-1 のコードページ。(このエンコードは英文専用です)
ISO_8859_1 = 28591
# 現在の文字コードのコードページ。
Default = case $KCODE
when "UTF8" then UTF_8
when "EUC" then EUC_JP
when "SJIS" then Shift_JIS
else ISO_8859_1
end
end
# 全てのクラスから参照できるメソッドを定義しているモジュール。
module Kernel
module_function
# 文字コードを変換した結果を返します。
def convert_encoding(string, before, after)
wc2mb(after, mb2wc(before, string)).delete("\0")
end
# 指定したエンコードの文字列を Unicode 文字列に変換します。
def mb2wc(encode, string)
ucl = QuietLab::Win32API.kernel32_MultiByteToWideChar \
(encode, 0, string, -1, nil, 0)
uct = "\0" * (ucl * 2)
QuietLab::Win32API.kernel32_MultiByteToWideChar \
(encode, 0, string, -1, uct, ucl)
uct
end
# Unicode 文字列を指定したエンコードの文字列に変換します。
def wc2mb(encode, string)
mbl = QuietLab::Win32API.kernel32_WideCharToMultiByte \
(encode, 0, string, -1, nil, 0, nil, nil)
mbt = "\0" * mbl
QuietLab::Win32API.kernel32_WideCharToMultiByte \
(encode, 0, string, -1, mbt, mbl, nil, nil)
mbt
end
end
# QuietLab ScriptFormat v1.20