はじめに

Wizardry Onlineで遊んでいると、チャットが非常に不便じゃないですか?
このゲームに限らず、せかせかとした移動中にチャットすることは困難ですよね?
PK、PKKとの粋な会話もままならない…
というわけで作ってみました。
チャットマクロツール。

ご安心ください。
あくまでWindowsに仮想キーを送信するソフトであって、WizOn専用のソフトというわけではありません。
ゲームの通信を傍受したり、クライアントソフトを解析したり、そういうややこしいことは一切していません。
単にユーザーのwindowsへの入力を補助するだけのツールです。
これが駄目ならIMEの辞書登録すら駄目ってことになると思うので、規約には抵触しないと考えます。

特定の操作をユーザーがすると、
クリップボードに台詞セット→Enterキー→Ctrl+Vキー→EnterキーのマクロをWindowsに送信するだけです。
結果的に、アクティブなウィンドウにユーザーがキー入力したのと同じ結果になります。(理論上は)

オチから言うと、Wizardry Online では使えませんでした。
※理由は後述します。
ですので、単なるコンセプトモデルの説明になります。


使い方

①当ソフトと対象ソフトを立ち上げる。(順番は不問)
UI用の細長いウィンドウ(※常に最前面)と座標判定用画像のウィンドウが立ち上がります。
マウスカーソルを座標判定用画像上で動かしてみてください。
UIウィンドウのタイトルバーに各色にセットされた台詞が表示されます。(rgb.png、rgb.txt参照)
もちろん、ユーザーが編集できますので、やろうと思えば255×255×255色分台詞をセットできます(重くなるでしょうが)
94fd89c5.png



②座標判定用画像のウィンドウを対象ソフトと同じ位置、大きさに調整。
(↓の画像だと、ウィズオンのつもり.txtが操作対象ソフト,ゲーム)
(ドラッグするか、UIウィンドウのコンボボックスで大きさを選ぶ)
71cf98d5.png


『不透明度』のコンボボックスを半透明化すると位置合わせに便利です。
WizONで使えば、こんな感じ。各色のゲーム画面上での位置を頭に叩き込むのに便利。
(※ゲームのSS画像を元に判定用画像を作ると使い易いと思います)
0d224080.jpg



③位置が大体合えば、対象(ゲーム)ソフトをアクティブにする。
(画像ウィンドウは最小化 or 閉じても可。そこに画像があるものとして扱われる)
(UIウィンドウの「画像を表示」ボタンを押せば再表示、再調整できる)
④UIウィンドウを任意の位置、大きさにする。(邪魔にならないように細くすること推奨)
43a298ef.png


WizOnだとこんな感じ。お好きな細長さにしてWizOnをアクティブにします。
※UIウィンドウを間違ってクリックすると、そっちがアクティブになってしまうので注意
邪魔にならない大きさと位置にしましょう
8982480d.jpg

このくらい小さくしても可
st_04.png


⑤マウスカーソルが座標判定用画像の座標内のときにQ+E or W+A+Dキーを押す。
6577edc1.png


⑥クリップボードに台詞をセット→Enterキー→Ctrl+V→Enterキーの仮想キーが
Windowsに送信されます。
結果的にアクティブなウィンドウにチャットマクロが送信されます。

※メモ帳なので「qe 改行 おはようございます 改行」となったが、
WizOnなら「チャットウィンドウ開く→おはようございます と言って→チャットウィンドウを閉じる」になる筈…でした

その他注意点!:
BBSやSNSの入力フォームなどで、チャットを誤爆しないようにくれぐれもご注意ください。
(※誤爆し難いように、Q+Eのような妙な入力方法にしてあります)
(※UIウィンドウを最小化すると機能offにできます)



Wizardry Onlineでは動かない理由

残念ながらWizOnでは動きません。
Wizardry Onlineを立ち上げると、nProtectかそれ相当のソフトが仮想キーの送信を掻き消しているようです。
Wizardry Onlineが立ち上がった状態では、メモ帳への仮想キー送信すらできなくなります。

と、いうわけでメモ帳相手にぐらいしか使えません。残念。


ダウンロード

どんな感じのソフトなのか試してみたい方はこちら
※.Net Framework 4.0以上が必要です
http://www1.axfc.net/uploader/Sc/so/301539.zip&key=makkoi


ソースコード

キモになる部分だけ
※全部見たい方がいらしゃったらコメントください
Microsoft Visual C# 2010 Expressにて作成



using System.Runtime.InteropServices;

// ※あらかじめ Clipboard.SetDataObject(chat, false);されている

public static void ExecChatBtn(string chat)
{
const int KeyDown = 0;
const int KeyUp = 2;
//const int wait = 10;

// Enterキー押し下げて、上げる
keybd_event((byte)Keys.Enter, 0, KeyDown, (UIntPtr)0);
keybd_event((byte)Keys.Enter, 0, KeyUp, (UIntPtr)0);

// Ctrlキーを押し下げ、Vキーを押し下げ、Vキーを上げ、Ctrlキーを上げ
keybd_event((byte)Keys.ControlKey, 0, KeyDown, (UIntPtr)0);
keybd_event((byte)Keys.V, 0, KeyDown, (UIntPtr)0);
keybd_event((byte)Keys.V, 0, KeyUp, (UIntPtr)0);
keybd_event((byte)Keys.ControlKey, 0, KeyUp, (UIntPtr)0);

// Enterキー押し下げて、上げる
keybd_event((byte)Keys.Enter, 0, KeyDown, (UIntPtr)0);
keybd_event((byte)Keys.Enter, 0, KeyUp, (UIntPtr)0);
//System.Threading.Thread.Sleep(wait);//
}

[DllImport("user32.dll")]
public static extern short GetAsyncKeyState(int vKey);
[DllImport("user32.dll")]
public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);


WizOn起動中はクリップボードへの転送「Clipboard.SetDataObject」すら無効になる模様。
※ユーザー自身の操作によるコピペは可能。
仮想キーの送信も出来ないので困りものです。

追記:ブラウザゲームの『剣と魔法のログレス』でも試してみましたが、異常に成功率が低いです。
原因は不明。仮想キーの送信方法に一考の余地ありかも。
System.Threading.Thread.Sleep(wait)を試しに挟んでみたら、更に成功率が下がりました。