最終更新:
plug_in_create 2016年05月26日(木) 20:08:23履歴
比較的描画面積が小さく、更新が頻繁でなければ、FORMを利用してGUIで描画で十分だと考えられる。
(スレッドセーフにしないといけないが)
描画面積が大きい場合は、Windows APIを使い、WINDOWSに直接描画しなければならないが、難しいかもしれない。
(スレッドセーフにしないといけないが)
描画面積が大きい場合は、Windows APIを使い、WINDOWSに直接描画しなければならないが、難しいかもしれない。
using System.Runtime.InteropServices;
[DllImport("User32.dll")]
public extern static System.IntPtr GetDC(System.IntPtr hWnd);
[DllImport("User32.dll")]
public extern static System.IntPtr GetDC(System.IntPtr hWnd);
System.IntPtr DesktopHandle = GetDC(System.IntPtr.Zero);
g = System.Drawing.Graphics.FromHdc(DesktopHandle);
リソースを確実に開放する必要があります。
全画面を利用する場合は、こちらが適している(というかこっちじゃないと無理)
onPaintのタイミングで描画しないと、書いたものが再描画で消えてしまいます。
ゲームは高速に再描画されているので、onPaintトリガーが必要
この時点で、駄目ですね。
全画面の大きいFORMを使う方法は、マウスを使った瞬間、破綻するからNG
画面の脇に小さく表示する機能以外は実装が難しい。
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)); } }
タグ
最新コメント