Win32API を使ってプロセス間通信をやってみたいと思います。
マクロとかBOTとか作ってみたいなと思って、ちょっと調べてて自分なりに使えそうな情報をただまとめただけの記事です。
私の目標はフォーカスを奪われないで処理を実行したい。ただこれだけ。
昔から裏作業をさせてネットサーフィンは邪魔されたくないって思いが強いので、マウスカーソルを自動操作するマクロなんて邪道だと思っちゃっています。
完成図
コンソールに文字を打って、エンターキーを押すとメモ帳に文字を送信しています。

ソースコード
using System;
using System.Runtime.InteropServices;
using System.Text;
namespace ConsoleApp1
{
class Program
{
[DllImport("user32.dll")]
static extern IntPtr GetDesktopWindow();
[DllImport("user32.dll")]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, StringBuilder lParam);
const int WM_SETTEXT = 0X000C;
const int WM_GETTEXT = 0x000D;
static void Main(string[] args)
{
// デスクトップのウインドウハンドル取得
var hwnd = GetDesktopWindow();
// メモ帳のウインドウハンドル取得
hwnd = FindWindowEx(hwnd, IntPtr.Zero, "notepad", null);
// メモ帳ウインドウ内の「Edit」ウインドウのハンドル取得
hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Edit", null);
while (true)
{
// コンソールに入力された文字列を取得
var readText = Console.ReadLine();
if (string.IsNullOrWhiteSpace(readText))
{
// 未入力の場合、終了
return;
}
else
{
// メモ帳に入力されている文字列を取得
var sb = new StringBuilder();
SendMessage(hwnd, WM_GETTEXT, 255, sb);
sb.AppendLine(readText);
// メモ帳に文字列を送信
SendMessage(hwnd, WM_SETTEXT, 0, sb.ToString());
}
}
}
}
}