Как я могу убедиться, что данные отправлены в нужный процесс? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть считыватель штрих-кодов, работающий в Windows CE, в котором есть приложение, которое отправляет штрих-коды в приложение, работающее на ПК с использованием протокола TCP / IP.И мне нужно отправить данные, полученные в этом приложении, любому процессу MS ACCESS * 32, который является активным приложением, то есть это приложение является курсором ввода в текстовом поле, ожидающем ввода в активном окне.

Но когда я использую Process.GetCurrentProcess (), он не возвращает MS ACCESS в качестве текущего процесса, а возвращает приложение vb.net, даже если это приложение находится в фоновом режиме.

Приложение MS ACCESS находится впередний план, и если мы набираем с клавиатуры, он отправляет входные данные в текстовое поле формы в MS Access.

Я не понимаю, почему Process.GetCurrentProcess () не возвращает MS Access в качестве текущего процесса.

Я не хочу использовать идентификаторы процессов, потому что может быть запущено более одного приложения MS Access, и нужно быть уверенным, что данные отправлены тому, что находится на переднем плане.


Эта подпрограмма получает отсканированный штрих-код и проверяет, активен ли процесс MS ACCESS.Если это так, он отправляет данные на него.В противном случае он сообщает пользователю сделать Access активным приложением и повторяет попытку отправки данных через 15 секунд.В случае успеха он отправляет информацию на сканер штрих-кода.Если нет, то отправляет ошибку сканеру штрих-кода.

Private Sub HandleClientComm(ByVal client As Object)
        Try
            Dim tcpClient As TcpClient = DirectCast(client, TcpClient)
            Dim clientStream As NetworkStream = tcpClient.GetStream()

            Dim buffer As Byte() = New Byte(4095) {}
            Dim strCodeBarre As String = ""
            Dim bytesRead As Integer

            While True
                Dim strServerResponse As String = ""
                Dim Chrono As New Stopwatch
                Dim bTryAgain As Boolean = False

                Try
                    bytesRead = 0
                    bytesRead = clientStream.Read(buffer, 0, 4096)

                    strCodeBarre = Encoding.Unicode.GetString(buffer, 0, bytesRead)
                    If TextBox1.Text <> "" Then
                        TextBox1.Text &= vbNewLine
                    End If
                    TextBox1.Text &= strCodeBarre & " R"

                    strCodeBarre = Encoding.Unicode.GetString(buffer, 0, bytesRead)

                    Do
                        Dim currentProcess As Process = Process.GetCurrentProcess()
                        Dim NomProcess As String = currentProcess.ProcessName
                        Chrono.Reset()
                        While NomProcess <> "MS ACCESS *32" AndAlso Chrono.Elapsed.TotalSeconds < 15
                            MsgBox("Assurez-vous que l'application Expédition soit l'application active, vous avez 15 secondes pour le faire après avoir cliqué sur OK ", , "Process actif est " + NomProcess)

                            Chrono.Start()
                            Do
                                ' attendre 15 secondes     
                            Loop While Chrono.Elapsed.TotalSeconds < 15
                            ' vérifier quel est le process actif
                            currentProcess = Process.GetCurrentProcess()
                            NomProcess = currentProcess.ProcessName
                            If NomProcess <> "MS ACCESS *32" Then
                                Chrono.Reset()
                                Chrono.Start()
                            End If

                        End While
                        Chrono.Reset()
                        Chrono.Start()

                        Do
                        Loop While Not currentProcess.WaitForInputIdle(1000)
                        Chrono.Stop()
                        SendKeys.SendWait(strCodeBarre & vbCr)
                        TextBox1.Text &= "E" & Chrono.Elapsed.TotalSeconds
                        strServerResponse = "1 Barcode envoyé " + strCodeBarre
                        bTryAgain = True
                    Loop While bTryAgain

                    'strServerResponse = "1OK"
                Catch ex As Exception
                    strServerResponse = "0ERREUR" & vbNewLine & _
                                        "Une erreur s'est produite sur le PC de l'expédition." & vbNewLine & _
                                        "Veuillez réessayer."
                End Try

                If strServerResponse(0) = "1"c Then
                    TextBox1.Text &= "S"
                Else
                    TextBox1.Text &= "F"
                End If

                Dim sendBytes As Byte() = Encoding.Unicode.GetBytes(strServerResponse)
                clientStream.Write(sendBytes, 0, sendBytes.Length)
            End While

            tcpClient.Close()
        Catch
            ' Intentionnellement vide
        End Try
    End Sub

```

---------------------

I expected that Process.GetCurrentProcess() would be MS Access.

Process.GetCurrentProcess() it is not returning MS ACCESS as the current process it's returning the vb.net application instead even if that application is in the background.
...