C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: Formから他アプリへの入力


(過去ログ 60 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■34524 / inTopicNo.1)  Formから他アプリへの入力
  
□投稿者/ 3食納豆 (1回)-(2009/03/31(Tue) 19:32:33)

分類:[C#] 

初めまして、お世話になります。
現在、プログラムの勉強を兼ねて自作ツールをC#にて開発を行っております。

環境:OS WindowsXP SP3
   エディタ VisualStudio C# 2008 Express Edition
環境はこのようになっております。

作っているものの内容は、
「C#で作ったFormから他アプリ(例:hoge.exe)に対してキーボードの自動入力を行う」
といったものです。

流れは、
@Formのボタンを押す(ボタンクリックで以下のイベント開始)
Ahoge.exeが最前面に呼び出される(WinAPI関数:SetForegroundWindow、FindWindow使用)
Bhoge.exeに対してキーボードの自動入力(例:a b c d ...)などが開始される。
この様な感じを考えています。


@、Aの実装には成功しましたが、ウィンドウをアクティブにした後にBで「SendKeys.SendWait("{}");」を使い"UP"を送信した所、hoge.exeでは通常、キーボードから"UP"キーを押された時に起こる動作が、Formからのsendkeyではその動作がおこりませんでした。


もし、C#、WinAPI等で他のアプリに対して任意のキーボードの情報を送る方法等がありましたらどうぞご教授ください。m(__)m
よろしくお願い致します。





参考URL
http://web.sfc.keio.ac.jp/~shokai/archives/2008/03/c30_skype.html
http://homepage3.nifty.com/midori_no_bike/CS/


引用返信 編集キー/
■34578 / inTopicNo.2)  Re[1]: Formから他アプリへの入力
□投稿者/ chobi (26回)-(2009/04/01(Wed) 22:01:54)
実行環境:WinXP / 送り先:notepad.exe

SendKeys.SendWait("{UP}");

で普通にアップしますが・・・・


No34524 (3食納豆 さん) に返信
> 初めまして、お世話になります。
> 現在、プログラムの勉強を兼ねて自作ツールをC#にて開発を行っております。
>
> 環境:OS WindowsXP SP3
>    エディタ VisualStudio C# 2008 Express Edition
> 環境はこのようになっております。
>
> 作っているものの内容は、
> 「C#で作ったFormから他アプリ(例:hoge.exe)に対してキーボードの自動入力を行う」
> といったものです。
>
> 流れは、
> @Formのボタンを押す(ボタンクリックで以下のイベント開始)
> Ahoge.exeが最前面に呼び出される(WinAPI関数:SetForegroundWindow、FindWindow使用)
> Bhoge.exeに対してキーボードの自動入力(例:a b c d ...)などが開始される。
> この様な感じを考えています。
>
>
> @、Aの実装には成功しましたが、ウィンドウをアクティブにした後にBで「SendKeys.SendWait("{}");」を使い"UP"を送信した所、hoge.exeでは通常、キーボードから"UP"キーを押された時に起こる動作が、Formからのsendkeyではその動作がおこりませんでした。
>
>
> もし、C#、WinAPI等で他のアプリに対して任意のキーボードの情報を送る方法等がありましたらどうぞご教授ください。m(__)m
> よろしくお願い致します。
>
>
>
>
>
> 参考URL
> http://web.sfc.keio.ac.jp/~shokai/archives/2008/03/c30_skype.html
> http://homepage3.nifty.com/midori_no_bike/CS/
>
>
引用返信 編集キー/
■34579 / inTopicNo.3)  Re[2]: Formから他アプリへの入力
□投稿者/ chobi (27回)-(2009/04/01(Wed) 22:16:30)
hoge.exeがいかなるものか分かりませんが、
wndprocでウィンドウメッセージの処理してないんじゃないですか?



引用返信 編集キー/
■34582 / inTopicNo.4)  Re[3]: Formから他アプリへの入力
□投稿者/ 3食納豆 (2回)-(2009/04/01(Wed) 23:51:51)
No34578
No34579
chobiさん、返信ありがとうございます!
私の今回の書き込みは返信のみとなってしまいますが、wndprocのことを調べてから、試してみます。

ありがとうございますm(_ _)m


また、試行した際には結果の方を書き込みたいと思います。


> hoge.exeがいかなるものか分かりませんが、
> wndprocでウィンドウメッセージの処理してないんじゃないですか?
>
>
>
引用返信 編集キー/
■34585 / inTopicNo.5)  Re[4]: Formから他アプリへの入力
□投稿者/ 3食納豆 (3回)-(2009/04/02(Thu) 01:18:30)
早速メモ帳が動くかどうかテストしてみました。

ソースを記載致します。

using定義
 namespace定義
  class定義:Form
   Dllインポート
    イニシャライズ
======以下Formイベントです(Form Load、他ボタンイベントは割愛しました。)==========

    private void button3_Click(object sender, EventArgs e)//ボタンクリックでイベント開始
    {
      IntPtr hwnd = FindWindow(null, textBox1.Text);//ウィンドウ検索 
      if (hwnd != IntPtr.Zero) //textBox1には「メモ帳 - 無題」
      {
        if (IsWindowVisible(hwnd))
        {
          SetForegroundWindow(hwnd);      // アクティブにする
          System.Threading.Thread.Sleep(1000); //少し待つ
          SendKeys.SendWait("{UP}");      //↑キー 送信

        }
      }
    }

======Formイベント終了==========

結果:メモ帳の場合だと成功しました。

対象のアプリ(ここではhoge.exe)はゲームアプリなのですが、USB接続でのゲームパッドからは入力を受け付けません(PS/2接続のキーボードからは入力可)。何か特殊なプロテクトの様なものが施されていると想像しています。(汗)

WndProcについては、学習が必要なので、頑張りたいと思います!

失礼致します。
引用返信 編集キー/
■34589 / inTopicNo.6)  Re[5]: Formから他アプリへの入力
□投稿者/ chobi (28回)-(2009/04/02(Thu) 08:26:30)
spy++で観測すると
message == wm_keyup と wm_keydown
wparam == vk_up (仮想キーコード)
だったので、以下のような感じで受け取れました。

protected override void WndProc(ref Message m)
{
const int wm_keyup = 0x101;
const int vk_up = 0x26;
switch (m.Msg)
{
case wm_keyup:
if (m.WParam.ToInt32() == vk_up)
{
MessageBox.Show("受け取ったよ");
}
break;
default:
break;
}
base.WndProc(ref m);
}
引用返信 編集キー/
■34642 / inTopicNo.7)  Re[6]: Formから他アプリへの入力
□投稿者/ 3食納豆 (4回)-(2009/04/04(Sat) 12:49:52)
No34589 (chobi さん) に返信
ご返信ありがとうございます。m(_ _)m

下記のコードをどの部分に利用すればよいか、まだわからない状況です。

もう少し学習をしてからテストしたいと思います。



現在の参考にしているサイトです
http://d.hatena.ne.jp/KrdLab/20070311/1173603961
http://www.geocities.jp/hatanero/sendmessage1.html

C#初心者には難易度が高そうですが、諦めずに頑張ります!


> spy++で観測すると
> message == wm_keyup と wm_keydown
> wparam == vk_up (仮想キーコード)
> だったので、以下のような感じで受け取れました。
>
> protected override void WndProc(ref Message m)
> {
> const int wm_keyup = 0x101;
> const int vk_up = 0x26;
> switch (m.Msg)
> {
> case wm_keyup:
> if (m.WParam.ToInt32() == vk_up)
> {
> MessageBox.Show("受け取ったよ");
> }
> break;
> default:
> break;
> }
> base.WndProc(ref m);
> }
引用返信 編集キー/
■34666 / inTopicNo.8)  Re[7]: Formから他アプリへの入力
□投稿者/ 3食納豆 (5回)-(2009/04/05(Sun) 23:21:35)
途中経過です。

using定義
 namespace定義
  class定義:Form

    //新規に追加==========
    public class win32api
    {
     [DllImport("user32.dll")]
     public static extern uint keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);
    }
    //新規に追加==========

    Dllインポート
    イニシャライズ
======以下Formイベントです(Form Load、他ボタンイベントは割愛しました。)==========

    private void button3_Click(object sender, EventArgs e)//ボタンクリックでイベント開始
    {
      IntPtr hwnd = FindWindow(null, textBox1.Text);//ウィンドウ検索 
      if (hwnd != IntPtr.Zero) //textBox1には「メモ帳 - 無題」
      {
        if (IsWindowVisible(hwnd))
        {
          SetForegroundWindow(hwnd);      // アクティブにする
          System.Threading.Thread.Sleep(1000); //少し待つ
          //SendKeys.SendWait("{UP}");      //↑キー 送信

          //SendKeysを変更==========
          win32api.keybd_event(0x0026, 0, 0, (UIntPtr)0);//キーコード 26 UPキーの押下
          System.Threading.Thread.Sleep(1000);
          win32api.keybd_event(0x0026, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);//UPキーの押上
          
          //ここまで ==========

        }
      }
    }

======Formイベント終了==========

上記の形でテストしましたが、hoge.exeは依然沈黙を守っております。

また、この他の形でキーコード等のキー情報を送信できるという手段がありましたら、是非ご教授お願い致します。m(__)m
引用返信 編集キー/
■34667 / inTopicNo.9)  Re[8]: Formから他アプリへの入力
□投稿者/ 3食納豆 (6回)-(2009/04/06(Mon) 00:02:11)
追記

>       if (hwnd != IntPtr.Zero) //textBox1には「メモ帳 - 無題」


if (hwnd != IntPtr.Zero) //textBox1には「hoge.exe」

でした。


引用返信 編集キー/
■34668 / inTopicNo.10)  Re[9]: Formから他アプリへの入力
□投稿者/ Azulean (349回)-(2009/04/06(Mon) 00:15:22)
その対象のゲームはDirectInputで入力を得ているのでは?

古い知識から引っ張り出しての発言となりますが、DirectInputはメッセージを受け取って動作をしているわけではないので、keybd_eventでの仮想的な入力は無視されたような気がします。
軽くぐぐってみると、SendInputなら効果があるとかなんとか情報はありますが、確かめていません。


http://www.google.com/search?hl=ja&num=50&q=directinput+keybd_event&lr=lang_ja
http://www.google.com/search?hl=ja&num=50&q=directinput+SendInput&lr=lang_ja
引用返信 編集キー/
■34672 / inTopicNo.11)  Re[10]: Formから他アプリへの入力
□投稿者/ 3食納豆 (8回)-(2009/04/06(Mon) 03:04:06)
No34668 (Azulean さん) に返信
Azuleanさん、ご返信ありがとうございます。
下記のgoogleリンクを辿ったところ、Azuleanさんのご指摘の通りの文献が出てきました。

キーボードイベント等ではどうしても思い通りにいかなかったので、DirectInputについて調べてみます。(試行が足りないかもしれませんが。。)


夜分遅くにありがとうございます。

> その対象のゲームはDirectInputで入力を得ているのでは?
>
> 古い知識から引っ張り出しての発言となりますが、DirectInputはメッセージを受け取って動作をしているわけではないので、keybd_eventでの仮想的な入力は無視されたような気がします。
> 軽くぐぐってみると、SendInputなら効果があるとかなんとか情報はありますが、確かめていません。
>
>
> http://www.google.com/search?hl=ja&num=50&q=directinput+keybd_event&lr=lang_ja
> http://www.google.com/search?hl=ja&num=50&q=directinput+SendInput&lr=lang_ja
引用返信 編集キー/
■34673 / inTopicNo.12)  Re[11]: Formから他アプリへの入力
□投稿者/ 3食納豆 (9回)-(2009/04/06(Mon) 03:12:41)
追記です。

HKEY_CURRENT_USER\Software\Microsoft\DirectInput に対象としているゲームが登録されていました。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -