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

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

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

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

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

Q&A

解決済

3回答

2622閲覧

バックグラウンドにあるウインドウに対するショートカットキーの入力について

aaa1032

総合スコア10

C#

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Win32 API

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

1グッド

0クリップ

投稿2022/05/04 10:48

編集2022/05/05 04:19

やりたいこと:
バックグラウンドにあるブラウザ(chrome)に対し、ショートカットキーを入力し、新しいタブを作成したい。(ショートカットキーはCtrl+T)言語はC#です。
⇒新しいタブの作成は一例であり、CtrlやShift,Altとの組み合わせショートカットキーの入力が最終目標です。

試したこと:
1.Post message
chromeのウインドウハンドルを捉え、win32のPost messageでWM_KEYDOWN/WM_CHAR/WM_UPを組み合わせでトライしましたが、不可でした。
バックグラウンドにあるメモ帳に対し文字の入力はできましたので、Post messageの設定ができていないわけではありません。Ctrlとの組み合わせがダメでした。

2.key_event & SendInput & SendKeys
何れも可能でしたが、対象となるウインドウをアクティブにする必要があり、上述の「バックグラウンドにある…」が達成できません。

ご教示頂きたい事項
バックグラウンドにあるウインドウに対し、CtrlやShift,Altとの組み合わせショートカットキーを送信することはできないのでしょうか。ご存じの方いましたらご教示いただければ幸いです。

3.以下コードです。

C#

1using System; 2using System.Diagnostics; 3using System.Linq; 4using System.Runtime.InteropServices; 5 6namespace ConsoleApp1 7{ 8 class Program 9 { 10 [DllImport("user32.dll")] 11 static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 12 13 [DllImport("user32.dll")] 14 static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 15 16 [DllImport("user32.dll", SetLastError = true)] 17 public static extern IntPtr GetAncestor(IntPtr hWnd, uint gaFlags); 18 19 // 送信するメッセージ 20 const uint WM_KEYDOWN = 0x100; 21 const uint WM_UP = 0x0101; 22 const uint WM_CHAR= 0x0102; 23 24 const uint WM_LBUTTONDOWN = 0x0201; 25 const uint WM_LBUTTONUP = 0x0202; 26 const uint None = 0; 27 const uint MK_LBUTTON = 0x0001; 28 public const uint GA_ROOT = 2; 29 30 static void Test1() 31 { 32 //メモ帳確認用 33 //var hwnd = Process.GetProcessesByName("Notepad").First().MainWindowHandle; 34 //↓文字入力の場合はこっちのウインドウハンドル 35 //hwnd = FindWindowEx(hwnd, IntPtr.Zero, "richEditD2DPT", null); 36 //// aと入力 37 //PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x41, IntPtr.Zero); 38 39 //chromeの場合 40 var hwnd = Process.GetProcessesByName("chrome")[0].MainWindowHandle; 41 42 // ctrlと入力 43 PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x11, IntPtr.Zero); 44 // ctrlと入力 45 PostMessage(hwnd, WM_CHAR, (IntPtr)0x11, IntPtr.Zero); 46 47 // sと入力 48 PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x53, IntPtr.Zero); 49 // sと入力 50 PostMessage(hwnd, WM_CHAR, (IntPtr)0x53, IntPtr.Zero); 51 52 // tと入力 53 PostMessage(hwnd, WM_UP, (IntPtr)0x53, IntPtr.Zero); 54 // ctrlと入力 55 PostMessage(hwnd, WM_UP, (IntPtr)0x11, IntPtr.Zero); 56 57 } 58 59 static void Main(string[] args) 60 { 61 Test1(); 62 63 } 64 } 65} 66
hihijiji👍を押しています

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

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

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

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

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

KoichiSugiyama

2022/05/05 01:52

PostMessage関数でどのようなデータを送ったのか、ソースなども含め記載していただいた方がアドバイスを得やすいのではないかと思います。
hihijiji

2022/05/05 03:55

MK_CONTROLビットは立ててますか?
aaa1032

2022/05/05 04:18 編集

削除しました。
aaa1032

2022/05/05 04:21

コードを追加させて頂きました。 コードはWM_KEYDOWN/WM_CHAR/WM_UPをすべて書いていますが、WM_CHARを削除した場合…等全パターンで試しました。
aaa1032

2022/05/05 04:25

MK_CONTROLビットを知りませんでした。 コードを記載させて頂きましたが、MK_CONTROLビットが与える影響ありますでしょうか。
hihijiji

2022/05/05 04:59

PostMessage の wParam には MK_CONTROL(0x8) と keyコードのORしたものをセットします。 それでCTRLを押しながらになるはずです。
aaa1032

2022/05/05 08:08

ご連絡いただきありがとうございます。 知識不足で申し訳ありませんが、PostMessage の引数(wParam)をOR文にできるのでしょうか。
KoichiSugiyama

2022/05/05 15:07

私が気になったのは PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x11, IntPtr.Zero); の IntPtr.Zero です。WM_KEYDOWNのリファレンス(https://docs.microsoft.com/ja-jp/windows/win32/inputdev/wm-keydown)によると、lParamはIntPtr.Zeroではまずいのではないかと思います。「wm_keydown 同時押し 送信」というキーワードでWeb検索するとこういうサイトもありました(http://bbs.wankuma.com/index.cgi?mode=al2&namber=83033&KLOG=142)参考になりますでしょうか。
hihijiji

2022/05/06 03:03

ちょっと勘違いしてました。m(_ _)m Shift や Ctrl の状態を一緒に送れるのはマウス操作のときだけでしたね。
aaa1032

2022/05/06 05:12

hihijiji様 ご連絡頂きありがとうございました。 KoichiSugiyama様 ご連絡頂きありがとうございます。ご教示頂いたサイトを見てトライしてみます。 結果は本頁に記載するよう致します。
aaa1032

2022/05/07 05:28

lParamを変更しましたが、特に結果は変わらずでした。 ⇒Keystroke Message Flagsがまったく理解できません。 海外サイト等で「無理」という記載も見つかりましたので、本件は一旦終了したいと考えます。 ご意見ありがとうございました。
guest

回答3

0

Ctrl+Tと入力した結果発生するメッセージをPostしようとあれこれ試しましたが、該当するメッセージを特定できませんでした。メモ帳等であれば簡単にわかるのですが、Chromeはさっぱりです。
バックグラウンドにあるウインドウにショートカットキーはインプットできないんですかね。

投稿2022/05/08 12:32

aaa1032

総合スコア10

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

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

0

海外サイトで、SendMessage/PostMessageは、CTRLなどの修飾キーの状態をシミュレートできない旨記載されていましたので、情報共有のため記載します。
Ctrl+Tと入力した結果発生するメッセージをPostすればいけそうな気がするので、やってみます。

You cannot use SendMessage (or PostMessage, the correct one) to simulate the state of the modifiers keys, like CTRL. You must use SendInput().

リンク内容https://stackoverflow.com/questions/5144877/sending-ctrl-s-message-to-a-window

投稿2022/05/07 10:07

編集2022/05/07 10:08
aaa1032

総合スコア10

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

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

0

自己解決

海外サイト等で「無理」という記載も見つかりましたので、本件は一旦終了したいと考えます。
ご意見ありがとうございました。

投稿2022/05/07 05:29

aaa1032

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問