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

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

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

Re[1]: SendInputで、アプリケーションにキーを送信できない。


(過去ログ 41 を表示中)

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

■21010 / inTopicNo.1)  SendInputで、アプリケーションにキーを送信できない。
  
□投稿者/ yus (1回)-(2008/06/23(Mon) 15:32:44)

分類:[.NET 全般] 

初めまして。
あるアプリケーションの入力支援ツールを、VS2008Express(.NET3.5)のC#で作成しようと思っているのですが、キーをうまく送信することができません。
VBやVC++、.Net2.0や1.1の情報でも構わないので、少しでも案のある方はよろしくお願いします。


〜現状〜

キー入力の判定には、以下のサイトの「KeyboardHook3.cs」を使って、グローバルフックをしています。
http://hongliang.seesaa.net/article/7539988.html

キーの送信には、以下のサイトに書いてある、「SendKeys名前空間の、SendKeysクラス」を使っています。
これはSendInput関数を用いるものです。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=42587&forum=7


これらを用いて、マウス、キー入力共にメモ帳で送信出来ることを確認しました。

しかし対象のアプリでは、マウスの入力は出来ているのですが、キーの入力がコマンド入力時しか認識されず、そのアプリ特有のショートカットキー(例えば「u」等)を、同じ手順で送信することが出来ませんでした。

〜対象のアプリの状態について〜
コマンド入力時:テキスト入力を受け付けています。また、この状態ではきちんとキーを送信できます。
非コマンド入力時:このアプリが普通に動いているときの状態です。この状態では、キーボードのキーを押すと、キーに対応した機能が実行されます(F1でヘルプ等)。


以上のような感じで、そのアプリは通常動作時キー入力を受け付けないのかと思い、キー入力支援ツールの「UWSC」を使ってテストしてみたところ、こちらではきちんとキー入力が出来ていました。なので、アプリ側の問題ではなく、単順にプログラムの組み方が悪いと思われます。

以下、Homeボタンを押したときに、uキーをアクティブウィンドウに送信するForm1.csのソースです。
フォームには、何も配置していません。


------------------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using SendKeys;
using HongliangSoft.Utilities.Gui;
using System.Runtime.InteropServices;

namespace sampleKeyHookAndSendKeys
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        [DllImport("user32.dll")]
        static extern IntPtr GetMessageExtraInfo();

        private static KeyboardHook keyHook;

        private void Form1_Load(object sender, EventArgs e)
        {
            keyHook = new KeyboardHook();
            keyHook.KeyboardHooked += new KeyboardHookedEventHandler(keyHookProc);
        }

        private void keyHookProc(object sender, KeyboardHookedEventArgs e)
        {
            if (e.UpDown == KeyboardUpDown.Down)
            {
                if (e.KeyCode == Keys.Home)
                {
                    List<SendKeys.SendKeys.INPUT> inputs = new List<SendKeys.SendKeys.INPUT>();
                    {//uを押した状態
                        SendKeys.SendKeys.INPUT input = new SendKeys.SendKeys.INPUT();
                        input.type = SendKeys.SendKeys.type.INPUT_KEYBOARD;
                        input.ki.wVk = SendKeys.SendKeys.wVk.VK_U;
                        input.ki.dwFlags = SendKeys.SendKeys.dwFlags.KEYEVENTF_KEYDOWN;
                        input.ki.time = 0;
                        input.ki.wScan = 0;
                        input.ki.dwExtraInfo = GetMessageExtraInfo();
                        inputs.Add(input);
                    }
                    {//uを離した状態
                        SendKeys.SendKeys.INPUT input = new SendKeys.SendKeys.INPUT();
                        input.type = SendKeys.SendKeys.type.INPUT_KEYBOARD;
                        input.ki.wVk = SendKeys.SendKeys.wVk.VK_U;
                        input.ki.dwFlags = SendKeys.SendKeys.dwFlags.KEYEVENTF_KEYUP;
                        input.ki.time = 0;
                        input.ki.wScan = 0;
                        input.ki.dwExtraInfo = GetMessageExtraInfo();
                        inputs.Add(input);
                    }
                    SendKeys.SendKeys.SendInput(inputs.ToArray());
                }
            }
        }
    }
}

------------------------------------------------------------------------------------------

これでフォームを起動してる間は、「Home」ボタンを押すと「u」が入力されるようになります。しかし、アプリで「u」に割り当てた機能が実行されません。

input.ki.time = 0;
input.ki.wScan = 0;
input.ki.dwExtraInfo = GetMessageExtraInfo();

これらの使い方が良くわからないので、このあたりが関係してくるのでしょうか。

何か心当たりがあれば、どなたかよろしくお願いします。

引用返信 編集キー/
■21625 / inTopicNo.2)  Re[1]: SendInputで、アプリケーションにキーを送信できない。
□投稿者/ yus (2回)-(2008/07/06(Sun) 17:31:20)
自己レスです。

解決したわけではありませんが、解決方法が分かった気がします。

ManagedDirectX 1.0.2902.0 を用いてキーボード入力がされているかどうか確認してみたところ、
「Home」ボタンを押しても「Home」しか認識されておらず、「u」は入力されていないと判定されているようです。

なので、DirectInputでも認識するようにキー入力を対象のアプリに送信することができれば、
この問題は解決すると思われます。

SendInputを用いた場合にはこの問題を解決することは出来ないとし、この質問は解決済みとさせていただきます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -