У меня есть считыватель штрих-кодов, работающий в 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.