Simple Application for sending Keystroke in VB.NET

∥☆過路亽.° 提交于 2019-12-17 21:22:26

问题


I have an issue regarding Sendkeys Class, as i want to use this class in order to send some keystroke to the active application. As a first step i want to test the {Enter} keystroke, so in order to achieve that i made a simple application in vb.net 2010

Public Class Form1
Public Shared data As String
Private Sub SendintText(command As String)
    Try
        SendKeys.SendWait(command)
    Catch e As Exception
        MsgBox(e.StackTrace)
    End Try
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    data = TextBox1.Text.ToString
    SendingText(data)
End Sub

End Class

When i tried to run for {Enter} i have received infinit loop error: An unhandled exception of type 'System.StackOverflowException' occurred in System.Windows.Forms.dll Could someone help me?

LATER EDIT : In meantime i have found another example

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    System.Threading.Thread.Sleep(2000)
    SendKeys.SendWait("{ENTER}")
End Sub

If in background i have two applications :

  1. Visual Studio
  2. Target application

How can i focus on the target application, because now when i am running the form , that form became active..is there any solution to call the winform from command prompt with some parameter (the key that i want to send)?

Later Edit2 strong text i have give it up the idea for windows form, so finnally i have made a simple program in console application that simulates the keystroke ... Imports System Imports System.Windows.Forms

Module Module1

Sub Main(ByVal args() As String)
    Dim data As String = args(0)
    Console.WriteLine("You insert the : {0}", data)
    System.Threading.Thread.Sleep(5000)
    SendKeys.SendWait(data)
End Sub

End Module

By the way in order to use double quotes in a parameter you need \"test\"...(i have spent 15 min to find out) so it might be usefull... Thanks again for the informations.


回答1:


In order to sendkey to another application, you need to first activate that application on the button click and then send keys

MSDN Link

// Get a handle to an application window.
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName,
    string lpWindowName);

// Activate an application window.
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

// Send a series of key presses to the Calculator application.
private void button1_Click(object sender, EventArgs e)
{
    // Get a handle to the Calculator application. The window class
    // and window name were obtained using the Spy++ tool.
    IntPtr calculatorHandle = FindWindow("CalcFrame","Calculator");

    // Verify that Calculator is a running process.
    if (calculatorHandle == IntPtr.Zero)
    {
        MessageBox.Show("Calculator is not running.");
        return;
    }

    // Make Calculator the foreground application and send it 
    // a set of calculations.
    SetForegroundWindow(calculatorHandle);
    SendKeys.SendWait("111");
    SendKeys.SendWait("*");
    SendKeys.SendWait("11");
    SendKeys.SendWait("=");
}



回答2:


Button has focus. Button click event sends an enter keystroke. Sending an enter causes the button click event to fire. Infinite loop.

You could disable the button before and re-enable the button after the sendkeys routine is done to stop the infinite loop.

What you probably would want to do is switch the focus back to the application you want to send your keystrokes to.



来源:https://stackoverflow.com/questions/9789733/simple-application-for-sending-keystroke-in-vb-net

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!