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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

4438閲覧

BlueStacksへ外部アプリからマウスクリック操作

kon_do

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

0クリップ

投稿2019/04/08 14:02

編集2019/04/23 12:51

前提・実現したいこと

c#でwindowsAPIのSetCursorPos関数、SendInput関数を利用して、外部アプリケーションへのクリック操作を行うアプリを作成しています。

困っていること

画面上の任意の点をクリックするメソッドはでき、電卓やchrome等は作成したアプリから操作できているのですが、
BlueStacksというアプリだけマウスのクリックを受け付けずまたその解決方法が分からず困っています。
実際のマウスでのクリックには反応しており、なぜAPIからのクリックに反応しないのか分かりません。

解決等分かる方いましたら、ご教授宜しくお願い致します。

該当のソースコード

c#

1 [DllImport("user32.dll")] 2 extern static uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); 3 4 [StructLayout(LayoutKind.Sequential)] 5 struct INPUT 6 { 7 public int type; 8 public MOUSEINPUT mi; 9 } 10 11 [StructLayout(LayoutKind.Sequential)] 12 struct MOUSEINPUT 13 { 14 public int dx; 15 public int dy; 16 public int mouseData; 17 public int dwFlags; 18 public int time; 19 public IntPtr dwExtraInfo; 20 } 21 22 const int MOUSEEVENTF_LEFTDOWN = 0x0002; // 左ボタン Down 23 const int MOUSEEVENTF_LEFTUP = 0x0004; // 左ボタン Up 24 25 [DllImport("USER32.dll", CallingConvention = CallingConvention.StdCall)] 26 static extern void SetCursorPos(int X, int Y); 27 28 public void ClickMouse(int x, int y) 29 { 30 // マウスを移動する 31 SetCursorPos(x, y); 32 33 // クリックする 34 INPUT[] input = new INPUT[2]; 35 input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; 36 input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP; 37 SendInput(2, input, Marshal.SizeOf(input[0])); 38 } 39 40

補足情報(FW/ツールのバージョンなど)

実行環境
windows7 Home Premium 64bit
CPU core i5, メモリ 8GB
開発環境
Visual Studio2017
.NET Framework 4.5.2

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

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

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

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

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

guest

回答2

0

BlueStacks上のアプリを外部から操作していますが、MOUSEEVENTF_LEFTDOWNとMOUSEEVENTF_LEFTUPで別にSendInput()を呼び、間に100ms程度のsleepを入れると、うまくタッチできています。

投稿2021/04/01 00:19

Youichi256

総合スコア204

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

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

0

ベストアンサー

いろいろ調べてみましたが、BlueStacks はハイパーバイザー(Intel VT 等を使用するソフトウェアのこと)であるため、マウスやキーボードをパススルー(ドライバのやりとりを直接処理する)処理し、 Win32 Subsystem から送信されるマウスやキーボードメッセージを処理していない可能性があります。
SendInput は呼び出し元スレッドが所属するデスクトップの Win32 Subsystem に対してマウスとキーボードにメッセージをポストし、その後、Win32 Subsystem がメッセージを振り分けるウィンドウを判断して該当ウィンドウを保持するスレッドにメッセージをポストします。BlueStacks がこのポストされるメッセージを無視しているのであれば、SendInput では対処しようがありません。

別の可能性として nProtect のようなアンチハックソフトによって、SendInput で送信されるメッセージを除外している可能性もあるかと思います。この場合、該当ソフトの処理を見破らなければ、SendInput で送るのは難しいかと思います。


上記が正しいとすれば、ソフトウェアで解決するよりマウスやキーボードを自作する方が手っ取り早いです。最近は自作キット等も市販されていますので・・・。

投稿2019/05/02 05:59

編集2019/05/02 06:02
atata0319

総合スコア881

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問