お世話になります。C#で以下が実現できなくて困ってます。
・BraveBrowser> 引用テキストというChrome系ブラウザにMetamaskというExtensionをインストールしている
・BraveBrowserからMetamaskを起動すると、ロック解除のためのパスワード入力が求められる
・パスワード入力欄にフォーカスされている状態で、C#標準のSendKeys、user32.dllのSendInputのどちらからもうまく入力ができない
C#からパスワード文字列としてKey送信したいのですが、うまくいかない原因として何が考えられるでしょうか?
補足ですが、SendKeysではなぜか以下の状態から実行すると、ブラウザ本体のアドレス入力欄に文字列が送信されます。。。
※この画像のとき、パスワードの欄にフォーカスが当たってる状態です。
以下が実行時のサンプルコード抜粋です。
C
1 private void SendKeysTest() 2 { 3 // SendKeys版。だめです。 4 SendKeys.SendWait("A"); 5 6 // キーボード操作実行用のデータ 7 INPUT[] inp = new INPUT[4]; 8 9 // (1)キーボード(SHIFT)を押す 10 inp[0].type = INPUT_KEYBOARD; 11 inp[0].ki.wVk = VK_SHIFT; 12 inp[0].ki.wScan = (short)MapVirtualKey(inp[0].ki.wVk, 0); 13 inp[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYDOWN; 14 inp[0].ki.dwExtraInfo = 0; 15 inp[0].ki.time = 0; 16 17 // (2)キーボード(A)を押す 18 inp[1].type = INPUT_KEYBOARD; 19 inp[1].ki.wVk = (short)Keys.A; 20 inp[1].ki.wScan = (short)MapVirtualKey(inp[1].ki.wVk, 0); 21 inp[1].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYDOWN; 22 inp[1].ki.dwExtraInfo = 0; 23 inp[1].ki.time = 0; 24 25 // (3)キーボード(A)を離す 26 inp[2].type = INPUT_KEYBOARD; 27 inp[2].ki.wVk = (short)Keys.A; 28 inp[2].ki.wScan = (short)MapVirtualKey(inp[2].ki.wVk, 0); 29 inp[2].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP; 30 inp[2].ki.dwExtraInfo = 0; 31 inp[2].ki.time = 0; 32 33 // (4)キーボード(SHIFT)を離す 34 inp[3].type = INPUT_KEYBOARD; 35 inp[3].ki.wVk = VK_SHIFT; 36 inp[3].ki.wScan = (short)MapVirtualKey(inp[3].ki.wVk, 0); 37 inp[3].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP; 38 inp[3].ki.dwExtraInfo = 0; 39 inp[3].ki.time = 0; 40 41 // キーボード操作実行 42 SendInput(inp.Length, ref inp, Marshal.SizeOf(inp[0])); 43 }
どなたか何か情報をお持ちでしたらご教授頂けると助かりますmm
Chrome自体複雑な作りですし特に検証する気もないのでこちらに書きますが、見たところポップアップですしウィンドウハンドルが別なんじゃないでしょうか?
Inspectとかで研究してみては?
[ユーザー補助ツール-検査 - Win32 apps | Microsoft Docs](https://docs.microsoft.com/ja-jp/windows/win32/winauto/inspect-objects)
"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\inspect.exe"
とかにいます。
あぁそうかSendInputはハンドルとかは無関係でしたっけ。
> ※この画像のとき、パスワードの欄にフォーカスが当たってる状態です。
キーボードフォーカス(縦線のキャレット)がある状態ってことですよね?
めんどくさそうなので試す気はなかったのですが確認してみました。
この画面はロック解除画面ですね。
わたしはソフトウェアキーボードを自作して常用しているのですが、BraveBrowser・MetaMaskの組み合わせで問題なく入力できました(実装はSendInputを使用しています)
ひとつ気になったのですが、SendKeysTestはどう呼んでいますか?
ボタンなんかですとそちらがアクティブになり、キャレットが消えていることはないでしょうか。
あとはコードがあっているかということでしょうか?(私は何も覚えてません^^;
SendKeysも新しい実装ではSendInputを使用してるっぽいです(そうだとは言っていませんが^^;
[キーボード イベントをシミュレートする - Windows Forms .NET | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/input-keyboard/how-to-simulate-events)
SendKeysが勝手にSendInputしてくれるんであればお手軽ですね。試す価値はあるかもしれません。
<add key="SendKeys" value="SendInput"/>
色々とご回答ありがとうございます。
> ひとつ気になったのですが、SendKeysTestはどう呼んでいますか?
SendKeysTestはテスト用に切り出した処理ですが、これを呼ぶ前にThread.Sleepして、Metamaskのパスワード入力欄にキャレットを入れた状態で確認してみたがダメでした。
大分主旨が異なりますが、クリップボードにテキストをコピーしておいて、それをマウス操作で貼り付けるという、力業で回避しました。。。
またちょっと別の問題がありまして、user32.dllの SetCursorPos で、RDP接続したリモートデスクトップ上および、VMWareで動いてくれないという問題にぶち当たっております。。
(mouse_event でのクリックとかは動く。)

回答1件
あなたの回答
tips
プレビュー