我想要做的是创建一个简单的Windows应用程序,它将自己挂钩到NotePad上,然后模拟击键。我有打开NotePad的过程,将它带到前台然后模拟被按下的数字1。但是,如果我单击记事本,那么任何活动状态都会成为输入内容。
如何将此应用程序绑定到记事本,以便我可以单击并键入任何内容,此应用程序仍将命令推入记事本?
This is the DLL i'm using to simulate keypressing:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using WindowsInput;
namespace NotePadTesting
{
class Program
{
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,
string lpWindowName);
// Activate an application window.
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
static void Main(string[] args)
{
Process[] processes = Process.GetProcessesByName("notepad");
if (processes.Length == 0)
{
Process.Start("notepad.exe");
processes = Process.GetProcessesByName("notepad");
}
if (processes.Length == 0)
{
throw new Exception("Could not find notepad huh....");
}
IntPtr WindowHandle = processes[0].MainWindowHandle;
SetForegroundWindow(WindowHandle);
for (int i = 0; i < 500; i++)
{
System.Threading.Thread.Sleep(100);
InputSimulator.SimulateKeyPress(VirtualKeyCode.VK_1);
}
}
}
}
答案 0 :(得分:2)
如果您已经拥有要输入的窗口的句柄,则可以使用PostMessage功能。您只需要谷歌虚拟密钥码。
答案 1 :(得分:2)
您需要通过PostMessage与Notepad.exe
联系。您需要使用P/Invoke
技术从User32.dll
:
using System.Runtime.InteropServices;
internal static class NativeMethods
{
// This method signature is derived from MSDN's PostMessage declaration.
[DllImport("user32.dll")]
public static extern bool PostMessage(IntPtr hwnd, uint msg, uint wParam, uint lParam);
// Other p/invoke methods go here, such as FindWindow...
}
您可以使用FindWindow找到Notepad
,以便获取窗口的句柄(HWND
)。
执行此操作后,您可以将Keyboard Notifications发布到该窗口。这些通知模拟键盘输入,仅适用于该窗口,即使窗口最小化或不是前景窗口。
重要邮件将是WM_KEYDOWN,WM_KEYUP和WM_CHAR。其中许多内容采用扫描代码而非虚拟密钥代码,这意味着您需要来回翻译。这是通过MapVirtualKey完成的。所有WM命令都采用其LPARAM
和WPARAM
值的特定形式,因此请查看MSDN文档中的预期内容。
有一个名为Spy++
的工具(用于?)随Visual Studio一起提供,可以让您查看这些消息。对于这类东西来说,这是一个很好的调试/逆向工程工具。
使用上述所有Win32 API,您应该能够将击键发送到外部窗口。