uoclist(1プロセス)で2アカ操作を実現するためには
データ、表示、入力デバイス
を2垢ごとに切り分けて処理する必要があります。
uoclistは起動画面で分かるとおり、2003年から当時のUOZ/uohook4をベースにゴリゴリと
コードを書いて、基本構造は変わっていないために苦労します。
一から書いてしまったほうがスッキリするんだけど、それをデバッグしろというのは酷というもの><
Windowsのコモンダイアログは、表示=データベースみたいなところがあって、
それを利用してコードを書いていたため、データと表示とを完全分離するのに手を焼きます><
データ
uoclist 1プロセスで、2クライアント分のデータを保持するところまでは修正、確認済み。
通信処理をどうするかは思案中。
1入力スレッドで2クライアント分のデータ処理を行うか、2入力スレッドに分けるか。
1入力スレッド2クライアント処理だと、パケットが詰まって効率悪そう?
だけど
2入力スレッド2クライアントでスレッドセーフができているか未確認、ハマると苦労しそう。。。
表示
理想的には、アクティブなUOクライアントに応じてuoclistの各表示を更新するのがいいのですが、
それをするには、
方法1: 表示Windowは共通のもの1枚、アクティブなUOクライアントが変わったら、
表示Window内の表示データを一旦消去して書き直す
方法2: 表示Windowを2枚用意しておいて、アクティブなUOクライアントが変わったら
表示するWindowを切り替え表示する
方法3: 表示Windowはメイン垢専用として固定してしまい、機能限定のサブ垢用Windowを用意する
結局、安易な方法3で進めていくことにします。サブ垢用Windowはまだ実装していません。
入力デバイス
メイン垢のUOWindowからサブ垢へのUOWindowのキー入力
→ 実装手法の確認済み。WM_KEYDOWN/WM_KEYUPをPostMessage()する
メイン垢のUOWindowからサブ垢へのUOWindowのマウス入力
これが難しいです。
方法1: メイン垢のUOWindowのGetCursorPosをフックする
→ フックするにも、デバッグフック/IAT書き換えの2種類あります。
昔僕が実装した(そして捨てた)のはデバッグフックでの方法。
僕の開発環境/実行環境が32bitWindows7なので、デバッグフックの64bit対応は難しいです。
方法2: Packet38の自動移動利用
→ マウスでいちいち操作を切り替えるのは面倒なので、自動移動(追尾)は必要でしょう。
この方法は、僕用のuoclistでは随分と前から使用しているので実装の問題はなし。
当面の目標:
・サブ垢のclient.exe起動と管理
・トグルキー押下で、メイン中のclient.exeのキー入力情報をサブ垢に転送するモードを用意
・サブ垢でのマウスカーソル変化(タゲ)を、メイン垢の擬似タゲカーソルにして、
タゲカーソルのクリック情報をサブ垢に転送する
・Ctrlキー押しっぱなしの場合には、メイン垢のマウス入力情報をサブ垢に転送する
ここまで実装確認ができれば、以降時間をかけて^^;;;完成に持ち込みたいです。
0 件のコメント:
コメントを投稿