Search code examples
vb.netkeyboardkeystrokes

InputSimulator works while debugging but not when program is built


In my project im using inputsimulator and it works great when visual studio is ran as an administrator, but when i build it into a .exe it doesn't work even when i run it as administrator. here's my code

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    AutoSaveTimer.Enabled = True

    Try
        System.Threading.Thread.Sleep(50)
        GameConnection.SendKeyTo(Keys.OemSemicolon)
        System.Threading.Thread.Sleep(2000)
        GameConnection.SendKeyTo(Keys.K)
        System.Threading.Thread.Sleep(50)
        GameConnection.SendKeyTo(Keys.Enter)

    Catch AutoSaveExeption As GameException
        If AutoSaveExeption.GameErrorCode = GameError.GAME_ERR_SENDMSG Then
            ' Send message error - connection to Game lost.
            ' 
            MessageBox.Show("cant make a connection.... can't autosave sadly", AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
            SimConnectionBar.BackColor = Color.Red
        End If
    End Try
End Sub

it does send focus to the window i specify but it doesn't send the keystrokes


Solution

  • Try using SetForegroundWindow before sending any input to ensure your game does in fact have focus.The call to SetForegroundWindow should be made in your method just before sending the input.

        <DllImport("user32.dll")> _
    Public Shared Function SetForegroundWindow(hWnd As IntPtr) As Boolean
    End Function
    
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click `
    AutoSaveTimer.Enabled = True
    Try
        'Find the handle to the game. This can do it by searching for the process.
            Dim p As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcessesByName("notepad")
            'search for process notepad
            If p.Length > 0 Then
                'check if window was found
                'bring notepad to foreground
                SetForegroundWindow(p(0).MainWindowHandle)
            End If
    
            System.Threading.Thread.Sleep(50)
            GameConnection.SendKeyTo(Keys.OemSemicolon)
            System.Threading.Thread.Sleep(2000)
            GameConnection.SendKeyTo(Keys.K)
            System.Threading.Thread.Sleep(50)
            GameConnection.SendKeyTo(Keys.Enter)
    
        Catch AutoSaveExeption As GameException
            If AutoSaveExeption.GameErrorCode = GameError.GAME_ERR_SENDMSG Then
                ' Send message error - connection to Game lost.
                ' 
                MessageBox.Show("cant make a connection.... can't autosave sadly", AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                SimConnectionBar.BackColor = Color.Red
            End If
        End Try
    end sub