最終更新:
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));
}
}
タグ
最新コメント