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

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

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

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

Windows

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

4629閲覧

非アクティブウィンドウに対してキーボードとマウス入力を行いたい

daiki001

総合スコア6

C#

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

Windows

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/03/02 17:15

前提・実現したいこと

非アクティブウィンドウに対してキーボードとマウス入力を非アクティブのまま行いたいです。
プログラミング言語はC#で書いていますがWin32APIレベルの話になるかと思うのでC++で回答頂いても大丈夫です。

発生している問題・エラーメッセージ

  • Test1()

求める結果:メモ帳にはaと入力されるはず
テスト結果:何も入力されない

  • Test2()

求める結果:ペイントに点が描画されるはず
テスト結果:何も描画されない

該当のソースコード

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 public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); 12 13 // 送信するメッセージ 14 const uint WM_KEYDOWN = 0x100; 15 const uint WM_LBUTTONDOWN = 0x0201; 16 const uint WM_LBUTTONUP = 0x0202; 17 const uint None = 0; 18 const uint MK_LBUTTON = 0x0001; 19 20 /// <summary> 21 /// メモ帳にaと入力する 22 /// </summary> 23 static void Test1() 24 { 25 // https://www.papy.in/bbs/vc/200609/06090004.html 26 var hwnd = Process.GetProcessesByName("notepad").First().MainWindowHandle; 27 // aと入力 28 PostMessage(hwnd, WM_KEYDOWN, (IntPtr)0x41, IntPtr.Zero); 29 } 30 31 /// <summary> 32 /// ペイントでクリックする 33 /// </summary> 34 static void Test2() 35 { 36 // https://social.msdn.microsoft.com/Forums/ja-JP/90258227-a820-4de3-ae71-4bbf88076dd2/wpfc?forum=wpfja 37 var hwnd = Process.GetProcessesByName("mspaint").First().MainWindowHandle; 38 39 UInt16 x = 300; 40 UInt16 y = 300; 41 UInt32 pos = ((UInt32)y << 16) | (UInt32)x; 42 43 // クリックする 44 PostMessage(hwnd, (uint)WM_LBUTTONDOWN, new IntPtr((int)MK_LBUTTON), new IntPtr(pos)); 45 PostMessage(hwnd, (uint)WM_LBUTTONUP, new IntPtr((int)None), new IntPtr(pos)); 46 } 47 48 static void Main(string[] args) 49 { 50 Test1(); 51 Test2(); 52 } 53 } 54} 55

試したこと

  • こちらの方法もコピペで試しましたが動作しませんでした。

https://ja.stackoverflow.com/questions/29568/c%E3%81%AB%E3%81%A6%E9%9D%9E%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AE%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%B8%E3%82%AD%E3%83%BC%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%9F%E3%81%84

補足情報(FW/ツールのバージョンなど)

  • Windows 10 64bit 1709

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

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

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

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

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

Zuishin

2018/03/02 22:36

アクティブ化させないのは何のためですか?
guest

回答2

0

非アクティブウィンドウを非アクティブウィンドウのまま'''ユーザ'''が操作できるようにする方法があります。
ここで紹介する方法はゲームの外部サポートツールに使っている手法です。
ゲームのメインウィンドウのフォーカスを奪わずに、ユーザがツールを操作できるようにするという対応です。

Window の SourceInitialized イベントで以下を行います。

  • Windows API の SetWindowLong 関数を使って対象のウィンドウに WS_EX_NOACTIVATE を追加する。

Win32 API の使い方も知っているようですのでコードは省きます。

したいことと合致しないかもしれませんが、関連しそうな内容ですし、何かのヒントぐらいになるかもしれません。

投稿2018/04/26 12:25

編集2018/04/26 12:28
toydev

総合スコア297

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

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

0

ダメな場合というのは、宛先が間違っているか手順が間違っているかです

ぐぐったら出てきたところですが、これでどうでしょうか
http://mt-soft.sakura.ne.jp/web_dl/vb-parts/key_sendmessage/

投稿2018/03/02 23:45

y_waiwai

総合スコア87719

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

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

daiki002

2018/03/23 20:59

ご回答有り難うございます。 前のIDのログイン情報を忘れてしまい別のアカウントからの返信になります。 おっしゃるとおり宛先(Window ハンドル)の指定が誤っていました。 MainWindowを指定していましたが、正しくは子ウィンドウハンドルを指定する必要がありました。 (Spy++で確認できました。) 動作確認が取れたソースコードです。 https://pastebin.com/H59HBbXw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問