Создайте службу для выполнения exe-файла после открытия одного экрана в другом exe-файле (VB.NET) - PullRequest
0 голосов
/ 22 апреля 2011

Мой вопрос, возможно, не очень ясен, но я просто хочу знать, как этот процесс вызывается или ссылки, необходимые для создания чего-то подобного, так что я могу исследовать самостоятельно (но если у вас есть код, добро пожаловать .. LOL .. .)

В основном у меня есть 2 настольные программы (A и B). Для A у меня нет исходного кода, для B у меня есть. Что мне нужно, так это создать некую услугу / программу, которая после того, как из программы A появляется экран, автоматически запускает B. Другими словами, фиксирует момент, когда конкретный экран отображается в A, и выполняет B.

Мой реальный сценарий состоит в том, что у меня есть очень простой POS, где я не могу собрать демографические данные клиентов (почтовый индекс и т. Д.), Поэтому я создал второе приложение, чтобы зафиксировать это, но мои кассиры всегда забывают запустить программу и Мне нужно найти способ запустить его после показа экрана (скажем, «Изменить срок» в POS, чтобы они не забыли запустить его.

Любые указания будут оценены!

Спасибо

Ответы [ 2 ]

3 голосов
/ 23 апреля 2011

Итак, вот очень быстрый пример того, как вы можете сделать это с VB, который должно быть очень легко конвертировать в C # при необходимости. Код поиска видимых окон по заголовку. Если в вашем открытом окне нет заголовка, вам придется поработать немного больше. Вероятно, вы можете найти заголовок вашего основного приложения и просто перечислить его дочерние окна.

Сначала немного неуправляемого кода для непосредственного общения с Win32:

Option Strict On
Option Explicit On

Imports System.Runtime.InteropServices
Imports System.Text

Public Class Unmanaged
    <DllImport("user32.dll")>
    Public Shared Function EnumWindows(ByVal lpEnumFunc As CallBack, ByVal lParam As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function
    <DllImport("user32.dll", SetLastError:=True)>
    Public Shared Function GetWindowLong(ByVal hWnd As IntPtr, ByVal nIndex As Integer) As Integer
    End Function
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Public Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
    End Function
    <DllImport("user32.dll", SetLastError:=True)> _
    Public Shared Function IsWindowVisible(ByVal hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function

    Public Const SW_SHOW = 5
    Public Const SW_RESTORE = 9
    Public Const GW_OWNER = 4
    Public Const GWL_HWNDPARENT = (-8)
    Public Const GWL_EXSTYLE = (-20)
    Public Const WS_EX_TOOLWINDOW = &H80
    Public Const WS_EX_APPWINDOW = &H40000

    Public Delegate Function CallBack(ByVal hwnd As IntPtr, ByVal lParam As Integer) As Boolean
End Class

Затем модуль без графического интерфейса, который должен быть установлен в качестве объекта запуска:

Option Explicit On
Option Strict On

Module Module1
    ''//Code loosely base on http://msdntracker.blogspot.com/2008/03/list-currently-opened-windows-with.html

    ''//This is the title of the window that we are looking for
    Public ReadOnly WatchForTitle As String = "About Mozilla Firefox"

    ''//This is the form that we will show when we find the above
    Private MainForm As Form1

    <STAThread()>
    Public Sub Main()
        ''//Create the form but don not show it
        MainForm = New Form1()

        ''//Create an infinite loop that checks to see if the target window is open and sleeps for a bit between checks
        Do While True
            Unmanaged.EnumWindows(AddressOf fEnumWindowsCallBack, IntPtr.Zero)
            ''//Sleep for a bit
            System.Threading.Thread.Sleep(500)
        Loop
    End Sub

    Private Function fEnumWindowsCallBack(ByVal hwnd As IntPtr, ByVal lParam As Integer) As Boolean
        ''//Ignore our own handle
        If hwnd <> Form1.Handle Then
            ''//Make sure its visible
            If Unmanaged.IsWindowVisible(hwnd) Then
                Dim lExStyle = Unmanaged.GetWindowLong(hwnd, Unmanaged.GWL_EXSTYLE)

                ''//We probably want to ignore tool windows, but remove this if needed
                If (((lExStyle And Unmanaged.WS_EX_TOOLWINDOW) = 0)) Then

                    ''//Create a buffer to store the title of the window
                    Dim sWindowText As New System.Text.StringBuilder(256)

                    ''//Get the title of the window
                    Dim lReturn = Unmanaged.GetWindowText(hwnd, sWindowText, sWindowText.Length - 1)

                    ''//When you are looking for window title uncomment this line
                    'Trace.WriteLine(sWindowText)

                    ''//Sanity check, make sure we found a window title
                    If lReturn <> 0 Then
                        ''//See if it matches what we are looking for
                        If sWindowText.ToString() = WatchForTitle Then
                            ''//If so, show our form
                            Form1.ShowDialog()
                        End If
                    End If
                End If
            End If
        End If
        fEnumWindowsCallBack = True
    End Function
End Module

Наконец, создайте обычную форму Windows с именем Form1 (или что угодно, вам просто нужно изменить ее в модуле выше).

Если вы проверите это, откроется форма, если вы перейдете в меню «Справка Firefox» -> «О программе».

Я должен отметить, что это только начало. Вы захотите выполнить более эффективную проверку ошибок и обрабатывать их, когда программа закрывается или существует или что-то в этом роде.

0 голосов
/ 23 апреля 2011

Маловероятно, что существует какой-либо "хороший" способ взаимодействия с программой А. Не будет традиционного "события", которое вызовет подобное, или что-то в этом роде.

Ваша лучшая ставка будетглядя на некоторые вызовы WIN32 API.Например, вы можете использовать GetPixel (), чтобы вернуть цвет в определенном месте на экране.Таким образом, если программа A отображает определенное изображение или экран, который заметно отличается от любого другого экрана, вы можете написать код, который отслеживает экран и проверяет совпадение.Когда совпадение найдено, вы можете выполнить любой код, который хотите, включая запуск B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...