|
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 System.Diagnostics;
using System.Runtime.InteropServices;
namespace KeyInterrupts
{
public partial class Form1 : Form
{
const int INPUT_MOUSE = 0;
const int INPUT_KEYBOARD = 1;
const int INPUT_HARDWARE = 2;
[DllImport("user32.dll")]
private extern static Int32 MapVirtualKey(Int32 uCode, Int32 uMapType);
[DllImport("user32.dll")]
static extern int SendInput(int nInputs, ref INPUT pInputs, int cbSize);
[DllImport("user32.dll")]
static extern IntPtr GetMessageExtraInfo();
private struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
private struct KEYBDINPUT
{
public ushort wVk;
public ushort wScan;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}
private struct HARDWAREINPUT
{
public uint uMsg;
public ushort wParamL;
public ushort wParamH;
}
[StructLayout(LayoutKind.Explicit)]
private struct INPUT
{
[FieldOffset(0)]
public uint type;
[FieldOffset(4)]
public MOUSEINPUT mi;
[FieldOffset(4)]
public KEYBDINPUT ki;
[FieldOffset(4)]
public HARDWAREINPUT hi;
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
if (timer1.Enabled == true) {
timer1.Enabled = false;
} else {
timer1.Enabled = true;
}
}
private void timer1_Tick(object sender, EventArgs e)
{
INPUT input = new INPUT();
input.type = INPUT_KEYBOARD;
input.ki.time = 0;
input.ki.dwFlags = 0;
input.ki.wScan = 0x3B;
//input.ki.wScan = (ushort)MapVirtualKey(0x70, 0);
input.ki.dwExtraInfo = GetMessageExtraInfo();
SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT))).ToString();
input.ki.dwFlags = 2;
input.ki.wScan = 0x3B;
//input.ki.wScan = (ushort)MapVirtualKey(0x70, 0);
SendInput(1, ref input, Marshal.SizeOf(typeof(INPUT))).ToString();
}
}
}
SendInputのみの最小のテストコードを作ってみました。
Formにはボタンとタイマーだけがあります。
タイマーはややこしくならないように間隔を10秒としてあります。
タイマーはデフォルト無効で、ボタンを押すと開始する、もう一度押すと停止ととりあえずしてあります。
この状態で起動し、該当ソフトも準備した状態でボタンを押してタイマーを開始して
該当ソフトをアクティブにすればF1が送られるはずです。
メモ帳をアクティブにしている場合、F1が押されたことになりヘルプが開きます。
しかし実際に送りたいソフトや、パンヤ等をアクティブにしてもF1相当の動作はしません。
コード中ではwScanをフリーソフトで調べた値を直接指定の方で使い、
MapVirtualKeyの方はコメントアウトしてあります。
テスト自体はこのどちらもやっていますが、結果は同じでした。
SendInputの使い方自体が間違っていれば、その間違いをなおせば解決すると思いますが
もし
>原因1
>対象のソフトがドライバから直接読んでいる。
こちらの場合、それでも動作しているJTK等は
>キーボードミニフィルタドライバを作成して挿入する。
をしているという事になるんでしょうか?
|