Sewer
Sewer

Reputation: 19

Simulate "Key Press" on NON Foreground Window

I am currently developing a program that will send a "key press" (the letter A or 0x41 in virtual key codes) to another program (notepad) every X seconds.

The problem is that for it to work I need the other program (notepad) to be in the FOREGROUND, example :

Process[] processes = Process.GetProcessesByName("notepad");

foreach (Process proc in processes) {
    SetForegroundWindow(proc.MainWindowHandle);
    // Do Whatever
}

Thread.Sleep(1000);

Is there a way to do that WITHOUT notepad having to be in the foreground ?

Like something that could run in the background ?

Upvotes: 1

Views: 312

Answers (1)

Daniil Vlasenko
Daniil Vlasenko

Reputation: 500

You could do it via winApi. Try to use SendMessage

According to this link you can do following:

[DllImport("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

public static void sendKeystroke(ushort k)
{
    const uint WM_KEYDOWN = 0x100;
    const uint WM_SYSCOMMAND = 0x018;
    const uint SC_CLOSE = 0x053;

    IntPtr WindowToFind = FindWindow(null, "Untitled1 - Notepad++");

    IntPtr result3 = SendMessage(WindowToFind, WM_KEYDOWN, ((IntPtr)k), (IntPtr)0);
    //IntPtr result3 = SendMessage(WindowToFind, WM_KEYUP, ((IntPtr)c), (IntPtr)0);
}

Upvotes: 1

Related Questions