How do I generate keystrokes in a non-form applica

2019-06-03 15:07发布

问题:

So I have a huge program and decided I should make one of the methods run in a separate thread. So I put the method in a separate class, an activated it on my form. It seemed to worked just how I wanted it to until it got to part where it gave me this error:

SendKeys cannot run inside this application because the application is not handling Windows messages. Either change the application to handle messages, or use the SendKeys.SendWait method.

I tried looking for the answer online. I think I saw something about how SendKeys only works in a Form or something.

Can anyone tell me a way to simulate a keystroke without using SendKeys, OR a way to get SendKeys to work in a different, non-form thread?

回答1:

Your console application needs a message loop. This is done through the Application class. You will need to call Application.Run(ApplicationContext).

class MyApplicationContext : ApplicationContext 
{
    [STAThread]
    static void Main(string[] args) 
    {
        // Create the MyApplicationContext, that derives from ApplicationContext,
        // that manages when the application should exit.
        MyApplicationContext context = new MyApplicationContext();

        // Run the application with the specific context. It will exit when
        // the task completes and calls Exit().
        Application.Run(context);
    }

    Task backgroundTask;

    // This is the constructor of the ApplicationContext, we do not want to 
    // block here.
    private MyApplicationContext() 
    {
        backgroundTask = Task.Factory.StartNew(BackgroundTask);
        backgroundTask.ContinueWith(TaskComplete);
    }

    // This will allow the Application.Run(context) in the main function to 
    // unblock.
    private void TaskComplete(Task src)
    {
        this.ExitThread();
    }

    //Perform your actual work here.
    private void BackgroundTask()
    {
        //Stuff
        SendKeys.Send("{RIGHT}");
        //More stuff here
    }
}


回答2:

I Know this not an answer, but this how i used to do using ActiveX and Script

Set ws = CreateObject("WScript.Shell")

str = "Hi there... ~ Dont click your mouse while i am typing." & _
" ~~This is a send key example, using which you can send your keystrokes"
ws.Run("notepad.exe")
WScript.Sleep(1000)

For c=1 To Len(str)
WScript.Sleep(100) 'Increase the value for longer delay
ws.SendKeys Mid(str,c,1)
Next 

Save this code as file.vbs and double click to execute in windows machine.