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

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

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

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

Visual Studio

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

Windows

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

2回答

325閲覧

C# SendKeys.Sendが反応しない コードでキーを同時押し(ショートカットキー押下)した時と同じ挙動を再現したい。

mysknj

総合スコア4

C#

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

Visual Studio

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

Windows

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

1クリップ

投稿2024/11/24 07:30

編集2024/11/24 07:39

実現したいこと

C#勉強中の初心者です。
とある条件に達した際に他ソフトに対しショートカットキーで特定の操作を行いたく、
キーボード上で任意のショートカットキーが押されたという処理を作りたいのですが、検索で出てきた「SendKeys.Send("任意のキー");」という処理では実現できませんでした。
対象へのフォーカス云々あるとは思いますが、今回はそもそも対象物がフォーカスがあっていなくてもショートカットキーを受け付けるようにできており、他フォーム上などで該当のショートカットキー押下ではきちんと反応するため、キーが押されたという処理さえ正しく実行できれば動くとは思うのですが、SendKeysではただしく動きませんでした。
こちら解決策分かる方、ご教授お願いいたします。

C#
visualstudio:Windowsフォーム

発生している問題・分からないこと

例えばCtrl+Aという処理の場合以下を試しましたが、反応しません。
SendKeys.Send("^(A)");
SendKeys.Send("^A");

該当のソースコード

C#

1if(とある条件) 23//キーが押されたことにする 4SendKeys.Send("^(A)"); 5

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

どの記事もSendKeysを推奨しており、これでできるはずのようです。

補足

様々な組み合わせを試しましたが、どれも反応しませんでした。

フォームにテキストボックスを作って、テキストボックスにフォーカスを合わせた際は任意の文字が入力されているので、現在のやり方では自フォームを対象にしたキー操作?しかできないのでしょうか?

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

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

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

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

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

mysknj

2024/11/25 09:02

KOZ6.0さん ご回答ありがとうございます! keybd_eventというのがあるんですね。 使い方をググって、分からなかったのでアドバイス通りChatGPTに聞いて使い方が分かりました! 押下されるキーは自由に設定できるようにしたかったのでキー情報をByteに変換する処理など 結構大変でしたが、おかげさまで目的の挙動が実行できました!本当に助かりました! 今後はChatGPTも活用してみます!本当にありがとうございました。 ベストアンサーに選びたいので回答に同じ内容を投稿お願いしてもよいでしょうか? そちらに具体的にどうしたかのコメントを残してベストアンサーにさせていただきます!
KOZ6.0

2024/11/26 11:00

回答しておきました。
tmp

2024/11/26 21:36

SendKeys.Send("\x01"); で、CTRL-Aの制御コードをそのまま書いたらサクラエディタでは反応しました。 SendKeysのdocにどこにも、見当たらないので公開するアプリなどでは使わない方がよいですね。
mysknj

2024/11/27 08:13

SendでもByteで指令できるんですね! 今回はなぜか反応してほしexeがSendのキー情報を拾ってくれなかったのでkeybd_eventで対応しました。 コメントありがとうございました!
guest

回答2

0

ベストアンサー

こういう時は keybd_event API を使うのが定石かと。
https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-keybd_event
使い方は ChatGPT や Coplilot に
「C# keybd_event の使い方を教えて」と聞くと出てきますよ。

投稿2024/11/26 10:59

KOZ6.0

総合スコア2707

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

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

mysknj

2024/11/27 08:20

ご回答ありがとうございました! 本来ならSendでいけるはずなのですが今回操作したいexeはSendでは反応しなかったのでのでkeybd_eventで対応しました。内容は以下の通りです。 皆さんありがとうございました。 ```C# [DllImport("user32.dll", SetLastError = true)] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, IntPtr dwExtraInfo); public const uint KEYEVENTF_KEYDOWN = 0x0000; // キーが押された public const uint KEYEVENTF_KEYUP = 0x0002; // キーが離された public const byte VK_A = 0x41; public void keybd_eventメソッド(Byte[] keys)//任意のキーを指定 {   //細かい処理は省いてシンプルに任意のキーを押して離してのみ記載   keybd_event(key[num], 0, KEYEVENTF_KEYDOWN, IntPtr.Zero);   keybd_event(keyy[num], 0, KEYEVENTF_KEYDOWN, IntPtr.Zero);   System.Threading.Thread.Sleep(500);    keybd_event(key[num], 0, KEYEVENTF_KEYUP, IntPtr.Zero);   keybd_event(key[num], 0, KEYEVENTF_KEYUP, IntPtr.Zero); } ```
guest

0

SendKeys.Send("^a") にしてみたらどうですかね。

投稿2024/11/25 07:45

nururi

総合スコア160

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

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

mysknj

2024/11/25 08:55

ご回答ありがとうございます! 括弧を取って小文字にしてみましたが、反応しませんでした! keybd_event がうまくいったのでそちらを使ってみます!
nururi

2024/11/26 05:11

Windowsのメモ帳で試してみたのですが、SendKeysで普通にCTRL+Aの操作になりました。 まあkeybd_eventで解決されたようなので、それでいいんじゃないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問