他のアプリケーションでユーザーが押したキーを取得したいと思います。たとえば、メモ帳では、プログラム自体ではありません。これは、メソッドを使用してキーをメモ帳に連続的に送信するコーディングですが、PostMessage
キーが押されたときに停止したいと考えています。
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
[DllImport("user32.dll")]
public static extern IntPtr FindWindow(
string ClassName,
string WindowName);
[DllImport("User32.dll")]
public static extern IntPtr FindWindowEx(
IntPtr Parent,
IntPtr Child,
string lpszClass,
string lpszWindows);
[DllImport("User32.dll")]
public static extern Int32 PostMessage(
IntPtr hWnd,
int Msg,
int wParam,
int lParam);
private const int WM_KEYDOWN = 0x100;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(Test));
t.Start();
}
Boolean ControlKeyDown = true;
public void Test()
{
// retrieve Notepad main window handle
IntPtr Notepad = FindWindow("Notepad", "Untitled - Notepad");
if (!Notepad.Equals(IntPtr.Zero))
{
// retrieve Edit window handle of Notepad
IntPtr Checking = FindWindowEx(Notepad, IntPtr.Zero, "Edit", null);
if (!Checking.Equals(IntPtr.Zero))
{
while (ControlKeyDown)
{
Thread.Sleep(100);
PostMessage(Checking, WM_KEYDOWN, (int)Keys.A, 0);
}
}
}
}
したがって、私の考えは、ユーザーがメモ帳でキーを押したときにに設定ControlKeyDown
されます。インターネットで調査した後、このコードを見つけて編集しました:false
X
protected override void OnKeyDown(KeyEventArgs kea)
{
if (kea.KeyCode == Keys.X)
ControlKeyDown = false;
}
X
はい、これにより、間違いなくループが停止しますが、ユーザーがプログラムのキーを押したときにループが停止するため、これは望ましくありませんが、メモ帳では停止しません。これは、メモ帳でKeyEventArgs
はSystem.Windows.Forms.KeyEventArgs
なくメモ帳であるためです。
助けが必要 :(