Окно SAP скрыто при получении данных

Я пишу скрипт/программу для входа в SAP, затем просто получаю несколько битов данных от сотрудника и закрываю SAP.

Это я уже могу сделать, но я пытаюсь сделать причудливый графический интерфейс только для этого, вместо того, чтобы щелкать много окон в SAP, чтобы получить его ... в основном потому, что я ленив, не могу щелкнуть миллион вещей ... Некоторые называют это новшеством, я думаю: )

Я исследовал BackGroundWorker в vb.net, но не будет ли это по-прежнему загружать окно и просто поддерживать форму активной и отзывчивой во время работы программы?

У меня нет прав администратора (можно создавать и изменять учетные записи пользователей su01, pa30 и т. д.) на сервер и т. д., поэтому я не могу войти на сервер\базу данных… следовательно, запускаю скрипт для получения результата.

Кто-нибудь знает, как Ican регистрирует SAP и скрывает его во время работы?


person Pavle Stojanovic    schedule 27.10.2014    source источник


Ответы (1)


Вы можете проверить этот пост о том, как скрыть окно внешнего приложения. http://www.vbforums.com/showthread.php?669210-RESOLVED-Hiding-Window-of-external-process

В этом примере ребята пытаются запустить calc.exe в скрытом режиме.

Прежде всего, вставьте в начале вашего проекта

Imports System.Runtime.InteropServices

Затем вам нужно перечислить флаги для ShowWindow (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx

Private Enum ShowWindowCommand As Integer
    Hide = 0
    Show = 5
    Minimize = 6
    Restore = 9
End Enum

Установить состояние отображения указанного окна

 <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
 Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As ShowWindowCommand) As Boolean
 End Function

Определите, идентифицирует ли указанный дескриптор окна существующее окно

 <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
 Private Shared Function IsWindow(ByVal hWnd As IntPtr) As Boolean
 End Function

Определяет, свернуто ли указанное окно.

 Private Declare Auto Function IsIconic Lib "user32.dll" (ByVal hwnd As IntPtr) As Boolean

переменная для сохранения дескриптора окна (вы можете выбрать свое имя, но переименовать в другой части кода)

 Private calc_hWnd As IntPtr

запустить калькулятор windows (в вашем случае saplogon.exe) свернутый и скрытый, при загрузке формы

 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    Dim test As New Process
    Try
        ' file to launch            
        test.StartInfo.FileName = "calc.exe" ' note: full path not needed for windows calc.
        ' Note: This next line has no effect on WinXP "calc.exe" and some other apps like FireFox.
        'test.StartInfo.WindowStyle = ProcessWindowStyle.Minimized

        ' start the app
        test.Start()
        ' wait until app is in idle state
        test.WaitForInputIdle(-1)



        ' get app main window handle
        Dim tmp_hWnd As IntPtr = test.MainWindowHandle
        ' make sure handle is valid (non zero)


        ' try up to 10 times within one second
        ' do a re-try loop that runs for a second or two
        For i As Integer = 1 To 10
            tmp_hWnd = test.MainWindowHandle
            If Not tmp_hWnd.Equals(IntPtr.Zero) Then Exit For ' got handle so exit loop
            Threading.Thread.Sleep(100) ' wait 100ms
        Next '- try again 




        If Not tmp_hWnd.Equals(IntPtr.Zero) Then
            ' use ShowWindow to change app window state (minimize and hide it).
            ShowWindow(tmp_hWnd, ShowWindowCommand.Minimize)
            ShowWindow(tmp_hWnd, ShowWindowCommand.Hide)
            ' save handle for later use.
            calc_hWnd = tmp_hWnd
        Else
            ' no window handle?
            MessageBox.Show("Unable to get a window handle!")
        End If
    Catch ex As Exception
        ' error !
        MessageBox.Show(ex.Message)
    End Try
End Sub

при выходе восстановить/отобразить приложение, если оно обнаружено запущенным.

Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    ' is our variable set to non-zero?
    If Not calc_hWnd.Equals(IntPtr.Zero) Then
        ' is app window found?
        If IsWindow(calc_hWnd) = True Then
            ' if app is minimized then restore it
            If IsIconic(calc_hWnd) Then
                ShowWindow(calc_hWnd, ShowWindowCommand.Restore)
            End If
            ' make sure window is seen incase it was hidden.
            ShowWindow(calc_hWnd, ShowWindowCommand.Show)
        End If
    End If
End Sub

Но вы можете написать другой код и убить процесс saplogon.exe.

Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    For Each p As Process In System.Diagnostics.Process.GetProcessesByName("saplogon.exe")
        Try
            p.Kill()
            ' possibly with a timeout
            p.WaitForExit()
            ' process has already exited - might be able to let this one go

        Catch ex As Exception
            MessageBox.Show(ex.toString)
       End Try
    Next
End Sub
person Maksym Sadovnychyy    schedule 26.03.2015