ACTのプラグインを作成していきます。 C#が理解できている方が前提です。 ACTの使い方などの説明ページではありません。

Windows APIを使う

比較的描画面積が小さく、更新が頻繁でなければ、FORMを利用してGUIで描画で十分だと考えられる。
(スレッドセーフにしないといけないが)
描画面積が大きい場合は、Windows APIを使い、WINDOWSに直接描画しなければならないが、難しいかもしれない。

User32.dllを使う

using System.Runtime.InteropServices;
[DllImport("User32.dll")]
public extern static System.IntPtr GetDC(System.IntPtr hWnd);

デスクトップのDCを取得する

System.IntPtr DesktopHandle = GetDC(System.IntPtr.Zero);

g = System.Drawing.Graphics.FromHdc(DesktopHandle);

リソースを確実に開放する必要があります。
全画面を利用する場合は、こちらが適している(というかこっちじゃないと無理)
onPaintのタイミングで描画しないと、書いたものが再描画で消えてしまいます。

ゲームは高速に再描画されているので、onPaintトリガーが必要
この時点で、駄目ですね。

全画面の大きいFORMを使う方法は、マウスを使った瞬間、破綻するからNG

画面の脇に小さく表示する機能以外は実装が難しい。

ソフトウェアキーボード

キー操作をコントロールできると…
ソフトウェアキーボード

意外な所で問題発生、どういううわけが動かない。
色々調べた結果、このDLLに渡す構造体のサイズが28バイトでないと動かないようだ。
なので、構造体に7バイト追加している
配列で定義したいが、言語の仕様上こうなってしまった…

( [StructLayout(LayoutKind.Explicit)]の為)

恐らくは、ログの結果に応じて、キーボードを押す事ができる。
ACTで使えるかどうかは未検証です。
ご利用は、自己責任でお願いします。



using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
// キーボードイベント(keybd_eventの引数と同様のデータ)
  class SendKey
    {

        [StructLayout(LayoutKind.Sequential)]
        private struct KEYBDINPUT
        {
            public short wVk;
            public short wScan;
            public int dwFlags;
            public int time;
            public int dwExtraInfo;
            public int dummy4;
            public byte dummy1;
            public byte dummy2;
            public byte dummy3;

        };
        [StructLayout(LayoutKind.Explicit)]
        private struct INPUT
        {
            [FieldOffset(0)]
            public int type;
            [FieldOffset(4)]
            public KEYBDINPUT ki;//16byte
            //Need 28Byte!
            //[FieldOffset(4)]
            //public MOUSEINPUT mi;
            //[FieldOffset(4)]
            //public HARDWAREINPUT hi;
        };

       // [MarshalAs(UnmanagedType.LPArray), In] INPUT[]
        // キー操作、マウス操作をシミュレート(擬似的に操作する)
        [DllImport("user32.dll")]
        private extern static UInt32 SendInput(int nInputs, ref INPUT pInputs, int cbsize);

        // 仮想キーコードをスキャンコードに変換
        [DllImport("user32.dll", EntryPoint = "MapVirtualKeyA")]
        private extern static int MapVirtualKey(int wCode, int wMapType);

        private const int INPUT_KEYBOARD = 1;               // キーボードイベント
        private const int KEYEVENTF_KEYDOWN = 0x0;          // キーを押す
        private const int KEYEVENTF_KEYUP = 0x2;            // キーを離す
        private const int KEYEVENTF_EXTENDEDKEY = 0x1;      // 拡張コード
        public const int VK_SHIFT = 0x10;                  // SHIFTキー
        public const int VK_CONTROL = 0x11;                // CONTROLキー

        public static void SendKeyPless(Keys keyCode, bool isEXTEND )
        {
            INPUT inp = new INPUT();
           
            // 押す
            inp.type = INPUT_KEYBOARD;
            inp.ki.wVk = (short)keyCode;
            inp.ki.wScan = (short)MapVirtualKey(inp.ki.wVk, 0);
            inp.ki.dwFlags = ((isEXTEND) ? (KEYEVENTF_EXTENDEDKEY) : 0x0) | KEYEVENTF_KEYDOWN;
            inp.ki.time = 0;
            inp.ki.dwExtraInfo = 0;
            SendInput(1, ref inp, Marshal.SizeOf(inp));

            System.Threading.Thread.Sleep(100);

            // 離す
            inp.ki.dwFlags = ((isEXTEND) ? (KEYEVENTF_EXTENDEDKEY) : 0x0) | KEYEVENTF_KEYUP;
            SendInput(1, ref inp, Marshal.SizeOf(inp));
        }
    }

ACTのFF14用プラグインに、公開された関数があるか調べる
ありませんでした。(終了)
FF14のチャットBOXにダイレクトにメッセージを送る?
未検証
タグ

コメントをかく


画像に記載されている文字を下のフォームに入力してください。

「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

管理人のみ編集できます