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

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

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

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

Windows

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

Win32 API

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

解決済

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

aaa1032
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です。

3回答

1評価

0クリップ

229閲覧

投稿2022/05/04 10:48

編集2022/05/08 21:32

やりたいこと:
バックグラウンドにあるブラウザ(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#

using System; using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; namespace ConsoleApp1 { class Program { [DllImport("user32.dll")] static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("user32.dll", SetLastError = true)] public static extern IntPtr GetAncestor(IntPtr hWnd, uint gaFlags); // 送信するメッセージ const uint WM_KEYDOWN = 0x100; const uint WM_UP = 0x0101; const uint WM_CHAR= 0x0102; const uint WM_LBUTTONDOWN = 0x0201; const uint WM_LBUTTONUP = 0x0202; const uint None = 0; const uint MK_LBUTTON = 0x0001; public const uint GA_ROOT = 2; static void Test1() { //メモ帳確認用 //var hwnd = Process.GetProcessesByName("Notepad").First().MainWindowHandle; //↓文字入力の場合はこっちのウインドウハンドル //hwnd = FindWindowEx(hwnd, IntPtr.Zero, "richEditD2DPT", null); //// aと入力 //PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x41, IntPtr.Zero); //chromeの場合 var hwnd = Process.GetProcessesByName("chrome")[0].MainWindowHandle; // ctrlと入力 PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x11, IntPtr.Zero); // ctrlと入力 PostMessage(hwnd, WM_CHAR, (IntPtr)0x11, IntPtr.Zero); // sと入力 PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x53, IntPtr.Zero); // sと入力 PostMessage(hwnd, WM_CHAR, (IntPtr)0x53, IntPtr.Zero); // tと入力 PostMessage(hwnd, WM_UP, (IntPtr)0x53, IntPtr.Zero); // ctrlと入力 PostMessage(hwnd, WM_UP, (IntPtr)0x11, IntPtr.Zero); } static void Main(string[] args) { Test1(); } } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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がまったく理解できません。 海外サイト等で「無理」という記載も見つかりましたので、本件は一旦終了したいと考えます。 ご意見ありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Windows

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

Win32 API

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