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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

894閲覧

外部アプリの制御について

Qoo

総合スコア1249

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/23 07:35

c#にて外部アプリを起動させ、そのアプリに対してキーコードを送信したいと考えています。
下記のコードを作成していろいろ試していますが、解決しないので質問させていただきます。

test1でアプリを起動します
test2でアプリをアクティブにします
test3でアプリに対してキーストロークを送信します

下記、コメントアウトしていますが、アプリをメモ帳にするとすべて正常に実行できていますが
本来制御したいアプリ(Cubaseという音楽ソフト)にすると、test1、test2は正常に実行されますが
test3が実行できません。
UnityEngine.Debug.Log("ハンドルが取得できません")の中に入ってくるので
ハンドルが取得できていないと思うのですが、test3で指定するハンドル名を把握する方法が知りたいです

ご存じの方がおられましたら教授いただけると助かります
よろしくお願いいたします

c#

1 2public void test1() 3{ 4 exProcess = new Process(); 5 //exProcess.StartInfo.FileName = @"notepad.exe"; メモ帳の場合 6 exProcess.StartInfo.FileName = @"C:\Program Files\Steinberg\Cubase LE AI Elements 9.5\Cubase LE AI Elements 9.5.exe"; 7 8 exProcess.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized; 9 exProcess.Start(); 10} 11 12public void test2() 13{ 14 //var windowName = "メモ帳"; 15 var windowName = "Cubase AI プロジェクト - The Lab Song 01"; 16 17 foreach (var kv in GetAllWindowTitle()) 18 { 19   if (kv.Value.Contains(windowName)) 20   { 21 UnityEngine.Debug.Log(kv.Key.ToString()); 22 UnityEngine.Debug.Log(kv.Value.ToString()); 23 24 if (kv.Key != GetForegroundWindow()) 25 { 26 SetForegroundWindow(kv.Key); 27 break; 28 } 29   } 30 } 31} 32 33public void test2() 34{ 35 36 Int32 WM_KEYDOWN = 0x0100; 37 38 // デスクトップのウインドウハンドル取得 39 IntPtr hwnd = GetDesktopWindow(); 40 41 // ウインドウハンドル取得 42 //hwnd = FindWindowEx(hwnd, IntPtr.Zero, "notepad", null); 43 hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Cubase AI プロジェクト - The Lab Song 01", null); 44 if (hwnd == IntPtr.Zero) 45 { 46 UnityEngine.Debug.Log("ハンドルが取得できません"); 47 return; 48 } 49 50 //メモ帳ウインドウ内の「edit」ウインドウのハンドル取得 51 //hwnd = FindWindowEx(hwnd, IntPtr.Zero, "edit", null); 52 53 PostMessage(hwnd, WM_KEYDOWN, VkKeyScan('a'), 0); 54} 55

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

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

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

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

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

guest

回答1

0

ベストアンサー

FindWindowEx 関数に渡す引数の内、第 3 と第 4 が逆だと思います。

hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Cubase AI プロジェクト - The Lab Song 01", null);

"Cubase AI プロジェクト - The Lab Song 01" というのはウインドウタイトル文字列ですよね。これは第 4 引数に指定します。その時、第 3 引数は null でよいです。Cubase のクラス名がわかれば指定してもよいですが、null でも構いません。

投稿2020/07/23 13:37

bboydaisuke

総合スコア5308

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

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

Qoo

2020/07/25 05:01

ありがとうございます。うまくいきました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問