質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1566閲覧

unityでのsendinput

matukazekun

総合スコア47

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

0クリップ

投稿2019/03/02 08:22

編集2019/03/02 08:24

unityでの、sendinputが上手に動作しません。unityのexeファイルを作成し、 exeを起動してwindowsへキーストローク出力がしたい。
できるだけ簡単に実装したい。

keybd_eventではスクリプトでのキーストロークの検知はできたが、exeに落とし込んでキーストロークの出力を試したが反応なし。

keybd_eventでの使用は推奨されていないのでsendinputでの実装を考えたが、
exeファイルの作り方がおかしかったのでkeybd_eventの出力ができなかったのかなとも未だにわだかまりが。
今回はunityでのsendinputの実装を可能にしたい。
unityでの参考書物があれば教えていただきたい。unity以外は読みつくしたと思う。
回答お願いします。

できれば完全に動くコードが欲しい。

using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Runtime.InteropServices; public class check1 : MonoBehaviour { [DllImport("user32.dll")] private extern static void SendInput(uint nInputs, ref INKey pInputs , int cbsize); [StructLayout(LayoutKind.Sequential)] private struct KEYBDINPUT { public byte wVk; public short wScan; public int dwFlags; public int time; public int dwExtraInfo; }; [StructLayout(LayoutKind.Sequential)] struct INKey { public int type; // 0 = INPUT_MOUSE, // 1 = INPUT_KEYBOARD, // 2 = INPUT_HARDWARE public KeyIN ks; } [StructLayout(LayoutKind.Explicit)] private struct KeyIN { [FieldOffset(0)] public KEYBDINPUT ki; }; private const int INPUT_KEYBOARD = 0x1; [DllImport("user32.dll", EntryPoint = "MapVirtualKeyA")] private extern static int MapVirtualKey( int wCode, int wMapType); // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.K)) { Debug.Log("押した"); const int num = 2; INKey[] ingo = new INKey[num]; ingo[0].type = INPUT_KEYBOARD; ingo[0].ks.ki.wVk = 0x41; ingo[0].ks.ki.wScan = 0x4; ingo[0].ks.ki.dwFlags = 0x1 | 0x0; SendInput(num, ref ingo[0], Marshal.SizeOf(ingo[0])); if (Input.GetKey(KeyCode.A)) { Debug.Log("記念日"); ingo[1].type = INPUT_KEYBOARD; ingo[1].ks.ki.wVk = 0x41; ingo[1].ks.ki.wScan = 0x4; ingo[1].ks.ki.dwFlags = 0x1 | 0x2; SendInput(num, ref ingo[0], Marshal.SizeOf(ingo[0])); } } } }
bochan2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bochan2

2019/03/03 13:36

質問頂きありがとうございます! 出来れば全ソースのファイル構成も分かるようにgithubやGoogleDrive等のダウンロードリンクを用意していただけると解決の役に立つと思います。
matukazekun

2019/03/03 13:57

現在ここに掲載しているものが全てです。
matukazekun

2019/03/03 13:57

全ソースって俺のすべてやんけ
guest

回答2

0

wwbQzhMkhhgEmhUさんとのやりとりを聞いた限りでは、Unityでやる意味は無いように感じられます。
同じゲームではないかと思っているかもしれませんが、Unityは表示や当たり判定などの処理を行うものであり、マウスのマクロ機能(ですよね?)を作るのには、むしろ足枷になります。

投稿2019/03/03 13:48

fiveHundred

総合スコア9797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matukazekun

2019/03/03 13:56

ゲームパッドにまで対応できるのはunityしか知らないもので・・ 自分ではunityがベストだったんですが・・・。
fiveHundred

2019/03/03 14:10

Unity製ではないゲームでも、ゲームパッドを使えるソフトはたくさんあるので、やり方はいくらでもあると思いますが…。 以下のように、Win32APIにもゲームパッドの入力を取得する関数はあるようです。 http://7ujm.net/C++/joypad.html
matukazekun

2019/03/03 14:22

ありがとy。もう寝ます。もし私のプロジェクトが気になるようでしたらふぁぼってください。 これツイアカです
bochan2

2019/03/04 13:13

>これツイアカです リンク載ってませんよ
guest

0

ベストアンサー

原因は32bitと64bitの構造体アラインの違いみたいです。
細かく見てないですが、WIN32API呼び出し系はpinvoke.netのをパクると手堅いです。

定義例

C#

1[StructLayout(LayoutKind.Sequential)] 2struct MOUSEINPUT 3{ 4 public int dx; 5 public int dy; 6 public uint mouseData; 7 public uint dwFlags; 8 public uint time; 9 public IntPtr dwExtraInfo; 10} 11 12[StructLayout(LayoutKind.Sequential)] 13struct KEYBDINPUT 14{ 15 public ushort wVk; 16 public ushort wScan; 17 public uint dwFlags; 18 public uint time; 19 public IntPtr dwExtraInfo; 20} 21 22[StructLayout(LayoutKind.Sequential)] 23struct HARDWAREINPUT 24{ 25 public int uMsg; 26 public short wParamL; 27 public short wParamH; 28} 29 30[StructLayout(LayoutKind.Explicit)] 31struct MouseKeybdHardwareInputUnion 32{ 33 [FieldOffset(0)] 34 public MOUSEINPUT mi; 35 36 [FieldOffset(0)] 37 public KEYBDINPUT ki; 38 39 [FieldOffset(0)] 40 public HARDWAREINPUT hi; 41} 42 43[StructLayout(LayoutKind.Sequential)] 44struct INPUT 45{ 46 public uint type; 47 public MouseKeybdHardwareInputUnion mkhi; 48} 49 50/// <summary> 51/// Synthesizes keystrokes, mouse motions, and button clicks. 52/// </summary> 53[DllImport("user32.dll")] 54static extern uint SendInput(uint nInputs, 55 [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, 56 int cbSize);

'A'を押して離す使用例

C#

1keyInput.type = 1; 2 3keyInput.mkhi.ki.wScan = 0; 4keyInput.mkhi.ki.time = 0; 5keyInput.mkhi.ki.dwFlags = (int)1; // KEYDOWN相当 6keyInput.mkhi.ki.dwExtraInfo = (IntPtr)0; // 面倒だったので適当。本当はGetMessageExtraInfo(); 7keyInput.mkhi.ki.wVk = (ushort)65; // 仮想キーコードA 8 9InputList[0] = keyInput; 10 11keyInput.mkhi.ki.dwFlags = (int)3; // KEYUP相当 12 13InputList[1] = keyInput; 14 15SendInput((uint)2, InputList, Marshal.SizeOf(InputList[0]));

参考リンク
https://stackoverflow.com/questions/6830651/sendinput-and-64bits

投稿2019/03/02 22:17

編集2019/03/02 22:20
wwbQzhMkhhgEmhU

総合スコア343

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matukazekun

2019/03/03 01:06

仕事から帰ったら確認したいとおもいます
matukazekun

2019/03/03 07:42

纏めてくれないとよくわかんないです。プログラミング始めてまだ1年もたっていないので・・・
wwbQzhMkhhgEmhU

2019/03/03 08:00

何が分からないのか分かりません。 動かないのなら調べますが、こちらでは32bitでも64bitでも動いてるので。 どうしても分からないなら諦めましょう。
matukazekun

2019/03/03 11:28

もう少しやさしく教えてくださいよ。 unityでintPtrなんかどうやって使うんですか? これって型の名前じゃないですよね? この場合のuntPtrってintとかfloatとかに相当する型の種類って意味ですよね? unityじゃあ、このintPtrってやつに相当する変数があるらしいんでしょうがそれがわからないんで 詰んでいます。多分このIntPtrってやつが分かればできると思うのですが・・・。 それと、2つ目のメッセージにあります、この使用するための文と、一つ目の宣言の文の兼ね合いはどんな感じなんでしょうか?私のやつならingo[0]で順順に.ks.ki.Vkと書いていけばいいのですが、 この文の感じだとちょっと違うのかなって思って。実際にも指定方法がわからず文の合成もできていない感じです。 ですのでまず、intPtrと2つ目の文章の合成方法を貴殿なりにでいいのでわかりやすく 書いていただければ幸いです。 貴重なunity先駆者なのでツイッターでフォローしたいです。
wwbQzhMkhhgEmhU

2019/03/03 11:54

君は多分.NETを知らないでC/C++も知らないでWin32APIを呼ぼうとしてるからいけない。 そもそもなんでそんなことをしたいのかも聞いていなかったんだけど、ぶっちゃけ普通にやってればこんな処理要らないと思うよ? それを無理くり呼びたいとか言ってるので、よほどややこしいことでもしてるのかと思った。 だから、コードまで全部載せた。でも分からないとか始まる上に、どうも自分がやろうとしていることをよく分かってないように見える。 実際SendInputを使ってキーを押させて何をしたいの?
matukazekun

2019/03/03 12:59

それって言わないとだめですか?金儲けのためじゃないんですが・・。
wwbQzhMkhhgEmhU

2019/03/03 13:00

は?じゃあ、もう諦めてください。
matukazekun

2019/03/03 13:16

言えばいいんですね、自分用のゲーミングマウスを作りたいんです。 売れば敵も増えるだろうから売らない
matukazekun

2019/03/03 13:18

そのためにキーボード出力がいる。 壊れてもフリーズしてもバグッても自分の中だけで終わらせる。正義のために使いたいし、 その力を使って人を嫌にさせるようにもしないつもりです。
matukazekun

2019/03/03 13:19

じゃあ、教えてくれますか?
wwbQzhMkhhgEmhU

2019/03/03 13:22

はぁ?もう勘弁してw 意味分からん
bochan2

2019/03/03 13:33

「そのためにキーボード出力がいる。」とは「売れば敵も増えるだろうからキーボード出力がいる。」という意味ですか? またのご質問をお待ちしています。
matukazekun

2019/03/03 13:38

このプログラム売ったら大変なことになるのは当然でしょ・ このプログラムの為にキーボードストローク実装がいるんでよ。 キーボードストローク無しにこれの完成はできんよ
matukazekun

2019/03/04 08:24

うんちっちうんちっちうんちっち できたァ・・・
wwbQzhMkhhgEmhU

2019/03/04 10:05

おめでとw 好きなゲームでBANされるような悲しいことはしないでね
matukazekun

2019/03/04 13:01

でも、自分が欲しかった機能じゃなかった(笑)(´;ω;`)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問