Frage : Notwendigkeit, einen Knopf auf einer Anwendung und einem monotor zu finden ist es Text

Ich habe using VB6sp6, das in der Lage gewesen wird, einen Knopf zu lokalisieren und ihn zu überwachen ist Text-/Untertitel-Änderung Using API-Anrufe. Jetzt werde ich mit der Aktualisierung meines Programms zu VB.NET eine Arbeit zugewiesen (ich verwende VS2008). Ich habe meine APP in VB.NET using den Zauberer in VS2008 aber umgewandelt, wie Sie Bild VB.NET gerade erlernend ich können, bin ein wenig konfuses. Ich mag verstehen, dass was es das unterschiedliche Handeln und erlernt, da ich autodidaktisches.

Let ich Erwähnung bin, ist der Knopf auf einer Anwendung, die ich überwachen muss und sendet eine Markierungsfahne einmal, die gewesen in diesem Zustand für 90 Sekunden knöpfen. Ich war, dies in VB6 zu tun aber kann; t scheinen, es fähig zu erhalten arbeitend im VB.NET

I morgens, das Fenster zu finden, aber nicht imstande, Vergangenheit ist zu erhalten, das den Knopf auf dem Application.

Here zeigen und finden, was ich bis jetzt habe;

Here ist die API-Funktionen, die ich verwende.
Public erklären Funktion FindWindow Bibliothek „user32.dll“ alias „FindWindowA“ (ByVal lpClassName als Schnur, ByVal lpWindowName als Schnur) wie Integer

Public Funktion EnumWindows Bibliothek „user32.dll“ erklären (ByVal lpEnumFunc als ganze Zahl, ByVal lParam als ganze Zahl) wie Integer

Public Funktion EnumChildWindows Bibliothek „user32.dll“ erklären (ByVal hWndParent als ganze Zahl, ByVal lpEnumFunc als ganze Zahl, ByVal lParam als ganze Zahl) da Integer


This ist, was ich verwende für das Finden des Fensters….
'Set, welchem Fenster, zum nach von
vHwnd = FindWindow („ClassName“, vbNullString),

I mehr liefern können, wenn Notwendigkeit aber… Ich denke, sobald ich Vergangenheit erhalte, die die oben genannten dann Anruf auf EnumChildWindows mit dem folgenden code
During die Umwandlung erhalten, sie mir diese Warnung während des Aufsteigens gab und ehrlich zu sein ich Mühe hat, meinen Verstand um das Konzept…
zu erhalten, " einen Delegierten für AddressOf EnumChildProc "

Public Funktion FIND_RELEASE () als Boolean
Dim FoundRelease als Object
Dim OKButtonHwnd als Object
Dim I hinzufügen, wie Object
HwndCount = 0 'das Handgriff counter
FoundReleaseButton = falsche 'Sätze knöpfen zum nicht found
RetVal = EnumChildWindows initialisieren (VoipHwnd, AddressOf EnumChildProc, CInt (0))

'Looks für das Neuanschlussknopf (Einfluss-Knopf)
For I = 0 zu HwndCount - 1
'Search Englisch, zum nach des Neuanschluss button
If zu suchen mittler (AppClass (i), 1, 6) = „Knopf“ und mittleres (AppText (i), 1, 9) = „schließen“ wieder an und FoundRelease = falsch dann 'suchen nach dem okaybutton
OKButtonHwnd = AppHwnd (i) 'Speicher das okayknopf handle
FoundRelease = zutreffender 'leichter Schlag das Schalterknopf found
End If
Next i
Dim FlashForm als frmFlash
If FoundRelease = zutreffendes Then
FoundReleaseButton = True
timHold.Enabled = True
ChangeTrayIcon (ich, (Me.Image3.Image))
'Seeing
If exHoldTime = CDbl („90“) Then
ChangeTrayIcon (ich, (Me.Image4.Image))
FlashForm = neues frmFlash
FlashForm.ShowDialog ()
FlashForm = Nothing
End If
Exit Function
End If
End Function


irgendwelche helfen, oder die Zeiger zu, was ich lesen muss, würden… jetzt suchend nach ein paar days.


großes sein

Antwort : Notwendigkeit, einen Knopf auf einer Anwendung und einem monotor zu finden ist es Text

Erste Sache, die ich mich empfehlen würde, verschiebt Ihren Vollstreckerservice außerhalb der Schleife.  Sie müssen wirklich nur das einmal verursachen.  Abhängig von Ihrer Implementierung können Sie in der Lage sein, es eine Kategorienvariable, irgendeine zu bilden ein Static, der durch alle Fälle dieser Kategorie oder des privaten Mitgliedes geteilt wird, wenn jede Kategorie seine eigene Gewindelache benötigt.  Jede Weise, solange Sie nicht den Service unten schließen, sind Sie in der Lage, jene Gewinde wiederzuverwenden, anstatt, auf die Unkosten von sie jedes Mal beginnen sich zu nehmen.  Wenn mehrfache Anrufe zu dieser Methode gleichzeitig laufen müssen, die Vollstreckerservice-Kreation zurück in die Methode, aber außerhalb der Schleife verschieben.

Sie sieht auch wie Sie herstellt 10 Gewindelachen, mit 10 Gewinden jedes, um jeden Auftrag zu verarbeiten aus.  Code, den ich angebracht habe, wird überarbeitet, um alle zu verarbeiten versah Aufträge mit 10 Gewinden.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
6:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
allgemeine Kategorie ClearDownService {
    private int-Gewinde;
    privates ExecutorService executorService;

    allgemeines ClearDownService (int-Gewinde) {
        wenn (Gewinde < 1="">= 1. „);
        }
        this.threads = Gewinde;
        this.executorService = Executors.newFixedThreadPool (this.threads);
    }

    // I änderte Ihren Wiederholungcode, um anzunehmen, dass Sie irgendeine Ansammlung OrderModel Gegenstände haben
    //, dass Sie pflegen, um das iterator zu erhalten.  Da Sie JDK 1.5+ benutzen, sein viel mehr
    // lesbar und haltbar Generics benutzen, anstatt, die Rückkehr von iterator.next zu werfen ().
    // I änderte auch Ihren Wiederholungcode, um das eingebaute foreach Konstruieren zu benutzen.
    Öffentlichkeit leere checkOrders ( Abholaufträge) {
        // initialisieren Verriegelung für die Gesamtzahl Aufträgen, anstelle von den Gewinden.
        //, das dieses sicherstellt, dass alle Aufträge verarbeitet werden, bevor diese Methode abschließt
        abschließendes CountDownLatch startLatch = neues CountDownLatch (orders.size ());

        //, da Sie JDK 1.5+ benutzen, einfacher, zu lesen und beizubehalten, wenn Sie Generics benutzen
        // und das eingebaute foreach anstelle vom iterator
        für (abschließendes OrderModel Modell: Aufträge) {
            executorService.submit (neues jagdbares () {
                Öffentlichkeitslücke laufen gelassen () {
                    Versuch {
                        Kalender jetzt = Calendar.getInstance (TimeZone.getTimeZone („Europa/London“));
                        wenn (isEligibleForClearDown (Modell, master.getCleardownFields () .getClearDownReqFrom (), jetzt)) {
                            wenn (model.getOrderFields () .hasParentOrderId ()) {
                                // fügen alle Kindaufträge Endergebnis hinzu
                                results.add (Modell);
                            } sonst {
                                // fügen Elternteilaufträge der Elternteilliste hinzu
                                parentOrders.add (Modell);
                            }
                        }
                    } schließlich {
                        //, das dieses in einen schließlich Block einsetzt, stellt sicher, dass er gedankenlos benannt erhält
                        // irgendwelcher Ausnahmen, die im Körper der Methode auftreten
                        startLatch.countDown ();
                    }
                }
            });
        }
        Versuch {
            startLatch.await (); //-Wartezeit für alle Gegenstände zur kompletten Verarbeitung
        } Fang (InterruptedException e) {
            LOGGER.error („unterbrochene Ausnahme bei der Aufwartung der Count-downverriegelung bis end.");
        }
    }
}
Weitere Lösungen  
 
programming4us programming4us