2015年12月16日水曜日

2アカ操作の進捗

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 件のコメント:

コメントを投稿