■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();
これらの使い方が良くわからないので、このあたりが関係してくるのでしょうか。
何か心当たりがあれば、どなたかよろしくお願いします。
|
|