Welche Möglichkeit/Sprache/Referenzen

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Gonger96.

    Welche Möglichkeit/Sprache/Referenzen

    Grüß Gott,

    hab da mal eine Frage, nur aus Neugier heraus. Bei uns in der Firma arbeiten wir mit vielen verschiedenen Programmen, um z.B. für einen Kunden Daten abzufragen. Zum "Datenabgriff", muss in jedem Programm die Kundennummer eingegeben werden. Nun hat sich bei uns eine Firma vorgestellt, die in der Lage ist, eine Plattform zu erstellen, bei der man nur einmal die Kundennummer eingibt und diese wird dann in allen anderen Programmen im Hintergrund übertragen.

    Es handelt sich hier nicht um eine Bildschirmaufzeichnung. Außerdem sind die Programmfenster täglich unterschiedlich platziert - mal minimiert im Hintergrund oder link/rechts im Eck vom Monitor.

    Kann sowas in VBA realisiert werden?
    Wenn ein Programm eine Kundennummer-Eingabe erwartet, dann wird es doch nicht weitergehen, ehe es sie hat. Es sei denn, man hat alle diese Programme angepasst (an die neue Plattform) und sie holen sich diese Kundennummer nun von woanders.
    Verstehe ich das so richtig?:
    Der User gibt in einem der schon vorhandenen Programme eine Kundennummer ein, das Programm trägt diese automatisch in allen anderen ein.

    Wenn ja, ist das eigentlich ziemlich einfach zu realisieren, zumindest mit VB.NET, mit VBA kenne ich mich nicht aus (warum überhaupt VBA?). Ich persöhnlich würde das auch nicht mal mit einer Bildschirmaufzeichnung machen, sondern eher über die Memory regeln, wenn du bei den Programmen keine Möglichkeit hast, eigene Plugins zu schreiben. Eine Bildschirmaufzeichnung wäre hier warscheinlich viel schwieriger zu gestalten, vor allem das Eintragen würde schwierig werden.
    Wenn du allerdings die Möglichkeit hast, Plugins selber zu erstellen, wäre dieser Weg natürlich viel einfacher, du könntest dann unter diesen Plugins kommunizieren, dafür würden sich beispielsweise Pipes anbieten, notfalls eine Textdatei, in welche die Kundennummer reingeschrieben wird.
    @sonne75
    Kennst du das Programm CheatEngine? Damit kannst du Werte im RAM suchen, deren Veränderungen überwachen und diese Werte verändern. Sowas in der Art würde ich für den Lesepart des Programmes einsetzen, damit das eigene Programm schonmal weiß, was die aktuelle Kundennummer ist. Für das Eintragen in die Textboxen der anderen Programme kannst du dann FindWindow, GetChildWindow, SendMessage und Konsorten verwenden.
    @sonne75
    Fast, das Programm überwacht Änderungen an den Stelle im Arbeitsspeicher, wo die Kundennummern vom Programm zwischengespeichert werden und überträgt diese dann in die anderen Programme.

    nafets3646 schrieb:

    und überträgt diese dann in die anderen Programme.

    Ich habe oben diesen Teil beschrieben, denn das war mir unklar: wie die anderen Programme die Daten kriegen...

    Was würde denn passieren, wenn eins dieser Programme die Kundennummer ändert? Würde sich die "zentrale" Kundennummer auch ändern? Wobei es bestimmt das "Zentral"-Programm bestimmt (bzw. der Programmierer davon).
    So könnte das aussehen (Pseudocode!):

    VB.NET-Quellcode

    1. Private Running As Boolean = True
    2. Public Sub MemoryWatcher()
    3. Dim Program1MemoryAdressOfKundennummer = Memory.GetAdressOf("Programm1.KundennummerBox")
    4. Dim Program2MemoryAdressOfKundennummer = Memory.GetAdressOf("Programm2.KundennummerBox")
    5. Dim Program3MemoryAdressOfKundennummer = Memory.GetAdressOf("Programm3.KundennummerBox")
    6. Do While Running
    7. Dim MemoryValues As IEnumerable(Of Integer) = {0, 0, 0}
    8. Dim AktuelleKundennummer As Integer = 0
    9. Do Until Not MemoryValues.All(Function(i) i = AktuelleKundennummer) 'Warten bis sich ein Wert geändert hat
    10. MemoryValues = { _
    11. Memory.GetValueAt(Program1MemoryAdressOfKundennummer), _
    12. Memory.GetValueAt(Program2MemoryAdressOfKundennummer), _
    13. Memory.GetValueAt(Program3MemoryAdressOfKundennummer) _
    14. }
    15. Loop
    16. Dim VorhandeneKundennummern As New Dictionary(Of Integer, Integer) 'Kundennummer, Anzahl
    17. For Each i In MemoryValues
    18. If VorhandeneKundennummern.ContainsKey(i) Then
    19. VorhandeneKundennummern.Item(i) += 1
    20. Else
    21. VorhandeneKundennummern.Add(i, 1)
    22. End If
    23. Next
    24. Dim NeueKundennummer As Integer = VorhandeneKundennummern.Single(Function(kvp) kvp.Value = 1).Value
    25. SendToTextBox(Program1MemoryAdressOfKundennummer, NeueKundennummer) 'Senden
    26. SendToTextBox(Program2MemoryAdressOfKundennummer, NeueKundennummer)
    27. SendToTextBox(Program3MemoryAdressOfKundennummer, NeueKundennummer)
    28. Loop
    29. End Sub
    Sorry - hatte mich nicht ganz klar ausgedrückt. Erstmal eine kleine Korrektur --> VBA natürlich nicht, sondern VB.net

    Hier nochmals der Ablauf:

    Eingabe der Kundennummer in neuer Form, die von der Firma individuell erstellt wird. Eingabe mit ok bestätigen. Anschließend wird die Kundennummer in Programm 1,2 und 3 übertragen und in den einzelnen Programmen aktiviert, sodass bei allen Programmen die Kundendaten zur Verfügung stehen.
    Sind die anderen Programme auch .NET-Basiert?
    Oder hast du deren quellcode?

    Wenn nicht muss man das vlt. über die Registry oder temporäre Dateien lösen, deren inhalt z.B. alle 100ms geprüft wird...
    wincrash
    (\_/) Das ist Hase.
    (O.o) Kopiere Hase in deine Signatur
    (> <) und hilf ihm so auf seinem Weg zur Weltherrschaft.
    Sollte eig. gehen. Du hohlst dir halt die benötigten Handels (FindWindow, FindWindowEx) und sendest dann die Kundennummer an die Programme per SendMessage. Probier das mal in einem klein Testprojekt aus, wenns da klappt gehts ans Größere
    @ ErfinderDesRades: Also es handelt sich um drei "Programme" eines davon höchstwahrscheinlich vb.net - kanns aber nich genau sagen. Das zweite ist eine alte DOS Plattform und das Dritte ist schlichtweg eine Browserplattform (wahrscheinlich PHP mit SQL oder so).

    @Wincrash: Die Quellcodes sind definitiv nicht offengelegt. Auch stellen keine der Programminhaber eine Schnittstelle zur Verfügung.


    Ich frage mich nur, wie die Programme angesteuert werden??? 8|
    Naja - irgendwie hab ich mir bereits die Finger wundgegoogelt - komm aber nicht wirklich weiter. :cursing: Kann mir jemand unter die Arme greifen?

    Um das Ganze zu verstehen habe ich mal zwei Progs gebastelt.

    Prog 1 = Sender
    Prog 2 = Empfänger

    Was soll erreicht werden. Inhalt Tetxbox Sender soll nach bestätigen an Textbox Empfänger übertragen werden.

    VB.NET-Quellcode

    1. ' Prog 1 Sender
    2. Public Class Form1
    3. 'SendMessage-API
    4. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    5. 'FindWindow (Hauptfenster finden)
    6. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    7. 'FindWindowEx (Unterfenster finden)
    8. Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Integer, ByVal hWndChildAfter As Integer, ByVal lpszClass As String, ByVal lpszWindow As String) As Integer
    9. 'Text einfügen
    10. Const WM_CHAR As Integer = &H102
    11. 'Hauptfenster
    12. Dim Hauptfenster As IntPtr
    13. 'Unser Control, die TextBox
    14. Dim TextBox As IntPtr
    15. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    16. ' --> Daten habe ich mit Winspector Spy herausbekommen - ob's Sinn macht, kann ich leider nicht sagen
    17. Hauptfenster = FindWindow(vbNullString, "WindowsForms10.Windows.8.app.0.2bf8089_r14_ad1")
    18. TextBox = FindWindowEx(Hauptfenster, 0, "WindowsForms10.Edit.app.0.2bf8089_r14_ad1", vbNullString)
    19. End Sub
    20. Private Sub TextBox1_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    21. SendMessage(TextBox, WM_CHAR, Asc(e.KeyChar), 0)
    22. End Sub
    23. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs)
    24. Me.Close()
    25. End Sub
    26. End Class


    VB.NET-Quellcode

    1. 'Prog 2 Empfänger
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    4. MsgBox(TextBox1.Text, vbExclamation, "MessageBox")
    5. End Sub
    6. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    7. Me.Close()
    8. End Sub
    9. End Class
    Hey,
    deine Deklarationen sind nicht ganz korrekt. Du kannst auf pinvoke.net im Suchfeld danach suchen, dort sollte es richtig stehen. Zur Frage: Prüf mal nach ob das Handle Null ist, wenn nicht setzt du per SetWindowText o. SendMessage(., WM_SETTEXT, "text") den Text.