C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ドライバレベルでのwindows10でのマウスクリックの実現

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■91701 / inTopicNo.1)  ドライバレベルでのwindows10でのマウスクリックの実現
  
□投稿者/ tori (1回)-(2019/07/22(Mon) 16:11:08)

分類:[.NET 全般] 

初心者です。
以下のURLを参照し、C#からのマウスの自動クリックを試みました。
http://whoopsidaisies.hatenablog.com/entry/2013/03/22/142031
ですが、特定のアプリはmouse_eventを受け付けないようでして、
HIDドライバからのアクセスでなければ、特定のアプリはC#からのマウスクリックを受け付けてくれないことがわかりました。
visual studio2019 communityから、HIDドライバを使ってC#からマウスを自動でクリックできる方法を
ご教授いただけないでしょうか。
マウスクリック(X座標、Y座標、クリック間隔)
といったコマンドでクリックができるようになりたいです。
よろしくお願いいたします。
引用返信 編集キー/
■91702 / inTopicNo.2)  Re[1]: ドライバレベルでのwindows10でのマウスクリックの実現
□投稿者/ とっちゃん (609回)-(2019/07/22(Mon) 18:10:17)
No91701 (tori さん) に返信

> 以下のURLを参照し、C#からのマウスの自動クリックを試みました。
> http://whoopsidaisies.hatenablog.com/entry/2013/03/22/142031
> ですが、特定のアプリはmouse_eventを受け付けないようでして、
> HIDドライバからのアクセスでなければ、特定のアプリはC#からのマウスクリックを受け付けてくれないことがわかりました。

どういう処理をした結果、うまく受け入れられなかったのでしょうか?
mouse_event を受け入れないということはないはずなんですが。。。

ちなみに。。。参考にしたページの mouse_event の定義は間違ってますね(影響はなさそうですけど)。

下記が mouse_event API の宣言(最新のSDKからの抜粋)です。

WINUSERAPI
VOID
WINAPI
mouse_event(
_In_ DWORD dwFlags,
_In_ DWORD dx,
_In_ DWORD dy,
_In_ DWORD dwData,
_In_ ULONG_PTR dwExtraInfo);

一つ目のパラメータはdefine フラグの組み合わせなので、C# 的には Flags 属性つけた enum がいいでしょう。
最後の、ULONG_PTR は、System.UintPtr と同じ意味なのでそういう風にしておくのが良いと思います(IntPtrでも一緒ですが)。

ということでザクっとこんな感じ。

[Flags]
enum MouseEventFlags : uint
{
Move = 0x0001,
LeftDown = 0x0002,
LeftUp = 0x0004,
RightDown = 0x0008,
RightUp = 0x0010,
MiddleDown = 0x0020,
MiddleUp = 0x0040,
XDown = 0x0080,
XUp = 0x0100,
Wheel = 0x0800,
HWheel = 0x1000,
VirutalDesk = 0x4000,
Absolute = 0x8000
}
[DllImport("User32.dll", CallingConvention=CallingConvention.Winapi)]
static extern void mouse_event( MouseEventFlags dwFlags, UInt32 dx, UInt32 dy, UInt32 dwData, UIntPtr dwExtraInfo);



> visual studio2019 communityから、HIDドライバを使ってC#からマウスを自動でクリックできる方法を
> ご教授いただけないでしょうか。
> マウスクリック(X座標、Y座標、クリック間隔)
> といったコマンドでクリックができるようになりたいです。

HIDドライバにアプリケーションからアクションを行うことができないと思います。

mouse_event が受け入れられないということはないと思いますが、どういうコードなのかわからないので何とも言えない。。。

引用返信 編集キー/
■91703 / inTopicNo.3)  Re[2]: ドライバレベルでのwindows10でのマウスクリックの実現
□投稿者/ tori (2回)-(2019/07/22(Mon) 19:06:31)
2019/07/22(Mon) 19:08:09 編集(投稿者)

とっちゃん様、お返事ありがとうございます。

> どういう処理をした結果、うまく受け入れられなかったのでしょうか?
> mouse_event を受け入れないということはないはずなんですが。。。
mouse_eventで左クリックをwindows標準のメモ帳や電卓が受け付けています。
ですが、試したいアプリでは、mouse_eventで左クリックを試みても
左クリックできません。


仮想のHIDドライバを作成し、仮想のHIDドライバから、
アプリケーションに文字を送るプログラムを以下URLの方が作成しています。
https://azyobuzin.hatenablog.com/entry/2018/07/26/022610
この方の真似をして、まずは文字を仮想のHIDドライバからメモ帳に送付しようと、visualstudio2019、windows10 64bitで
50時間ほど試行錯誤しましたが、私のレベルが低いため、エラーが発生しています。
引用返信 編集キー/
■91704 / inTopicNo.4)  Re[1]: ドライバレベルでのwindows10でのマウスクリックの実現
□投稿者/ 魔界の仮面弁士 (2253回)-(2019/07/22(Mon) 19:46:05)
No91701 (tori さん) に返信
> ですが、特定のアプリはmouse_eventを受け付けないようでして、

SendInput API に、MOUSEINPUT 共用体を含む INPUT 構造体を指定した場合も駄目でしょうか。
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput

あるいは対象の UIAutomation が得られるようなら、そこから Invoke できないか試してみるとか。
https://docs.microsoft.com/ja-jp/windows/win32/winauto/uiauto-controlpatternsoverview


> HIDドライバからのアクセスでなければ、特定のアプリはC#からのマウスクリックを受け付けてくれないことがわかりました。

具体的にどういう実装になっているのかが分からないのですが、
WM_LBUTTONDOWN / WM_LBUTTONDBLCLK / WM_LBUTTONUP 等ではなく、
Raw Input から data.mouse.ulButtons で受け取るアプリとか…?

でもその実装だとしても、マウスの絶対座標(≠相対移動距離)を得る部分は、
Raw Input / WM_INPUT ではなく、通常のマウス座標を取得している予感。
引用返信 編集キー/
■91705 / inTopicNo.5)  Re[2]: ドライバレベルでのwindows10でのマウスクリックの実現
□投稿者/ tori (3回)-(2019/07/22(Mon) 21:40:57)
魔界の仮面弁士さん、お返事ありがとうございます。
UIAutomationについては、難しく、よくわかりませんでした。

SendInput APIをC#で実行しましたが、メモ帳でクリック反応あり、
特定のアプリ(自動操作したいアプリ)でクリック反応なしでした。

なお、この自動操作したいアプリはハンドルを使ったAPIも一切受け付けません。
引用返信 編集キー/
■91706 / inTopicNo.6)  Re[3]: ドライバレベルでのwindows10でのマウスクリックの実現
□投稿者/ 魔界の仮面弁士 (2254回)-(2019/07/22(Mon) 22:48:38)
No91705 (tori さん) に返信
> 特定のアプリ(自動操作したいアプリ)でクリック反応なしでした。

UAC 絡みや 高DPI の座標ズレやアクティブウィンドウの違いといった話ではないのですよね。

該当アプリの仕様も、実際の呼び出しコードも第三者には分からないので、
アプリの仕様上の問題なのか、それとも呼び方が間違っているだけなのかは判断できないです。

INPUT 構造体配列の 2 要素目以降のマーシャリングに問題があるとか(アライメントとか)、
INPUT.mi.time の指定がそのアプリの仕様に合致して無いとか、
呼び出し元で Sleep していてメッセージループが阻害されていたとか…。

もちろん、呼び出し方は正しくて、アプリ側に何か仕込まれているという可能性もありますが、
現時点では判断できるだけの情報が無いです。
https://jinblog.at.webry.info/201604/article_1.html
http://emotion92.blog.fc2.com/blog-entry-485.html


> UIAutomationについては、難しく、よくわかりませんでした。

こちらについては、まずはコーディングを行う前に、
そのアプリが、MSAA あるいは UIAutomation をサポートしているかどうかを
Inspect なり UIAutomationSpy なりで確認してみてください。


クリックだけなら、昔ながらの MSAA でもいけるかも知れません。
Accessibility を参照設定して、Accessibility.IAccessible インターフェイスを辿って accDefaultAction メソッドで。
https://docs.microsoft.com/ja-jp/dotnet/api/accessibility.iaccessible.accdefaultaction


UIAutomation の方は、参照設定に UIAutomationClient を加えて、System.Windows.Automation 名前空間のクラス群を使います。

・UIAutomation の解説
https://www.atmarkit.co.jp/fdotnet/special/uiautomation/uiautomation_01.html
http://xoxopigs.com/uiautomation-1

・UIAutomation で電卓の数字キーを押す (C# / VB)
https://tercel-tech.hatenablog.com/entry/2015/04/29/181723
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=11855&page=0

・UIAutomation で Chrome の URL を取得 (PowerShell)
https://social.technet.microsoft.com/Forums/ja-JP/5bbef0be-3046-4b6c-943f-5b6ec4fb3aa3
引用返信 編集キー/
■91707 / inTopicNo.7)  Re[3]: ドライバレベルでのwindows10でのマウスクリックの実現
□投稿者/ とっちゃん (610回)-(2019/07/22(Mon) 23:19:48)
No91703 (tori さん) に返信
> 仮想のHIDドライバを作成し、仮想のHIDドライバから、
> アプリケーションに文字を送るプログラムを以下URLの方が作成しています。
> https://azyobuzin.hatenablog.com/entry/2018/07/26/022610
> この方の真似をして、まずは文字を仮想のHIDドライバからメモ帳に送付しようと、visualstudio2019、windows10 64bitで
> 50時間ほど試行錯誤しましたが、私のレベルが低いため、エラーが発生しています。

んと。。。このコード、C# ではなく、C か C++ ですよ。
そのあたりは問題ないのでしょうか?


No91705 (tori さん) に返信
> SendInput APIをC#で実行しましたが、メモ帳でクリック反応あり、
> 特定のアプリ(自動操作したいアプリ)でクリック反応なしでした。
>
> なお、この自動操作したいアプリはハンドルを使ったAPIも一切受け付けません。

ハンドルを使ったAPIというのはなんでしょう?
SendMessage とかですか?

うーん。。。状況がわからないので何とも言えないところはありますが、
その操作したいアプリというのは、実は、管理者権限で動いていて。。。なんてことはないでしょうか?

もし、その操作したいアプリが管理者権限で動いているという場合は作ったアプリも管理者権限で動かしてみてください。
たぶん状況が変わるんじゃないかと。。。

これ以上はちょっと思いつかないなぁ。。。

引用返信 編集キー/
■91708 / inTopicNo.8)  Re[1]: ドライバレベルでのwindows10でのマウスクリックの実現
□投稿者/ Azulean (1076回)-(2019/07/22(Mon) 23:35:45)
No91701 (tori さん) に返信
> 特定のアプリはmouse_eventを受け付けないようでして、
> HIDドライバからのアクセスでなければ、特定のアプリはC#からのマウスクリックを受け付けてくれないことがわかりました。

ちなみに、どういったアプリケーションなのですか?
アプリケーションの使用許諾などで自動操作やそれ以降に行おうとしている事柄を禁じていないかは確認しておいてくださいね。
引用返信 編集キー/
■91712 / inTopicNo.9)  Re[2]: ドライバレベルでのwindows10でのマウスクリックの実現
□投稿者/ tori (4回)-(2019/07/23(Tue) 21:22:13)
皆様、ありがとうございました。

魔界の仮面弁士様
勉強になりました。

とっちゃん様
作ったプログラムを管理者権限で実行したら、
他のプログラムも反応しました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ