C#将控制台应用程序连接到记事本

我想要做的是创建一个简单的Windows应用程序,将自己挂接到记事本上,然后模拟按键。 我有打开记事本的过程,将它带到前台,然后模拟被按下的数字1。 但是,如果我点击记事本,则任何活动都会变成正在输入的内容。

如何将此应用程序绑定到记事本,以便我可以单击并输入任何内容,并且此应用程序仍将命令推入记事本中?

这是我用来模拟按键的DLL:

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);

            }


        }
    }
}

如果您已经拥有要输入的窗口的句柄,则可以使用PostMessage函数。 你只需要谷歌虚拟键码。


您将需要通过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 )。

一旦你这样做,你可以发布键盘通知到该窗口。 这些通知模拟键盘输入并仅用于该窗口,即使窗口最小化或者不是前景窗口。

重要的消息将是WM_KEYDOWN,WM_KEYUP和WM_CHAR。 其中许多采用扫描代码而不是虚拟键码 ,这意味着您需要来回翻译。 这是通过MapVirtualKey完成的。 所有WM命令都采用特定形式的LPARAMWPARAM值,因此请检查MSDN文档中的内容。

有一个名为Spy++的工具(用于?)随Visual Studio一起提供,可让您查看这些消息。 这对于这种类型的东西来说是一个很好的调试/逆向工程工具。

使用所有上述Win32 API,您应该能够将按键发送到外部窗口。

链接地址: http://www.djcxy.com/p/76457.html

上一篇: C# Hooking a Console Application to Notepad

下一篇: Streaming H264 using RaspberryPi camera