开发者

Simulating a keypress AND keyrelease in another application?

开发者 https://www.devze.com 2022-12-12 07:41 出处:网络
I need to interact with an external application开发者_StackOverflow running, and send specific keypresses & releases. I\'ve tried to use the SendKeys class, but it does only half of the job, as th

I need to interact with an external application开发者_StackOverflow running, and send specific keypresses & releases. I've tried to use the SendKeys class, but it does only half of the job, as the keypress is being sent with an immediate keyrelease to the external applications.

I need to be able to simulate a "key hold down" for the external app. I'm now trying to use the SendMessage thing, but for now it won't work at all :( and I don't even get errors.


Ok, case solved. I actually installed VC++ to try the core keybd_event() function, and after it worked I was able to use it wisely in C#.

Here's the code, and surprisingly it's very simple. You'll need to add this using to your code to be able to import dll's: using System.Runtime.InteropServices;

This code will press and hold the '1' button for 3 secs, and then will release for 1 second and repeat the process.

(the code highlight got messed up :/, copy from 'namespace ...' to the last bracket '}')

public class Program 
{ 
    [DllImport("user32.dll")] 
    private static extern void keybd_event(byte bVk, byte bScan, 
        uint dwFlags, UIntPtr dwExtraInfo);

    private static void Main(string[] args)
    {            
        while (true)
        {
            keybd_event((byte)0x31, (byte)0x02, 0, UIntPtr.Zero);
            Thread.Sleep(3000);

            keybd_event((byte)0x31, (byte)0x82, (uint)0x2, UIntPtr.Zero);
            Thread.Sleep(1000);
        }
    }
}


have you tried using PostMessage to send WM_KEYDOWN and WM_KEYUP ?

Edit

You would use it this way (I am writing in C++, but you can easily use PInvoke and ..NET)

HWND hwnd = FindWindow(NULL,_T("Mywindow"));
PostMessage(hwnd,WM_KEYDOWN,VK_A,0);


You can use the WSH Scripting Shell to do this:

var shell   = new WshShellClass();
var missing = System.Reflection.Missing.Value;

shell.SendKeys("MOO!!!", ref missing);

All you need to do is add a COM reference to "Windows Scripting Host Object", version 1.0. Everything is in the namespace IWshRuntimeLibrary.


The official API is SendInput.

0

精彩评论

暂无评论...
验证码 换一张
取 消