2012-04-07 2 views
0

So habe ich ein großes Programm und entschied, dass ich eine der Methoden in einem separaten Thread ausführen sollte. Also lege ich die Methode in eine separate Klasse und aktiviere sie auf meinem Formular. Es schien gearbeitet, wie ich es wollte, bis er bekam zu einem Teil, wo es mir diesen Fehler gab:Wie erzeuge ich Tastenanschläge in einer nicht-Formular-Anwendung

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.

Ich habe versucht, online für die Antwort suchen. Ich denke, ich habe etwas darüber gesehen, wie SendKeys nur in einem Formular oder so funktioniert.

Kann mir jemand eine Möglichkeit sagen, einen Tastendruck zu simulieren, ohne SendKeys zu verwenden, ODER eine Möglichkeit, SendKeys in einem anderen non-form Thread zu arbeiten?

+0

Bitte zeigen Sie eine Quelle ... was genau haben Sie versucht? – Yahia

+0

Nur so tun, es geht so. Beispiel einer öffentlichen Klasse() { Sendkeys.Send ("{RIGHT}"); } aber das funktioniert nicht wegen des Fehlers, den ich bekomme. –

+1

@ user1219649 anstatt uns vorzutäuschen, zeigen Sie uns, was Sie gerade tun, und Sie werden viel mehr nützliche Antworten bekommen –

Antwort

5

Ihre Konsolenanwendung benötigt eine Nachrichtenschleife. Dies geschieht über die Klasse Application. Sie müssen Application.Run(ApplicationContext) anrufen.

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 
    } 
} 
+0

Der obige Code gab mir tatsächlich ein paar Fehler. Das "this.Exit()" funktioniert nicht, da es besagt, dass Exit() nicht vorhanden ist. Und auch wenn ich versuche, die Klasse von meinem Hauptformular aus aufzurufen, gibt es mir einen Fehler, indem ich sage, dass "Klasse aufgrund ihres Schutzlevels nicht zugänglich ist". Irgendeine Hilfe? –

+0

This.Exit hat nicht funktioniert, weil Sie wahrscheinlich vergessen haben, die Klasse von ApplicationContext zu erben. Die Zugriffsebene ist, weil sie einen privaten Konstruktor hat. Wenn Sie diesen Code jedoch aus einem Formular verwenden, sollte dies nicht notwendig sein. Dies dient zum Abrufen einer Nachrichtenschleife in einer Konsolenanwendung. Verwenden Sie für eine Formularanwendung einfach einen BackgroundWorker und geben Sie dort Ihren sendkeys-Code ein. –

+0

Ich glaube, ich hatte einen Tippfehler, es sollte 'this.ExitThread()' sein –

1

Ich weiß, das keine Antwort, aber das, wie ich ActiveX und 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 

Speichern Sie diesen Code als file.vbs und doppelklicken Sie verwendet, um zu tun.