sendmessage

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von musclebreast.

    sendmessage

    hi,

    ich schon wieder:) Ich habe noch eine kleine Frage..ich habe die Klassen und Handles von meinem chat. Es sind ca. 50 und es gibt drei Varianten Buttons, Textboxen und edit....

    1. 40 Handles sind Buttons...ich sehe aber nur 10...kann es sein dass die unsichtbaren auch aufgelistet sind ...denn in bestimmten Kontellationen tauchen auch andere Buttons aus...also können Buttons auch da seiin bevor sie sichtbar sind und kann man buttons erst auslesen wenn sie sichtbar sind?



    2. mein Größtes Problem ist das richtige zurodnen...naja bei 50 mit Fleiß schon so machen...ich wollte erstmal mir für jeden Button und texfenster mal einfach den text auslesen um mir einen überblick zu machen.

    VB.NET-Quellcode

    1. Private Declare Function SendMessage Lib "user32" _Alias "SendMessageA" ( _
    2. ByVal hWnd As Integer, _ByVal wMsg As Integer, _
    3. ByVal wParam As Integer, _
    4. ByVal lParam As Integer) As IntegerConst WM_GETTEXT = &HD
    5. Const WM_GETTEXTLENGTH = &HE

    VB.NET-Quellcode

    1. Debug.Print(SendMessage(hwnd, WM_GETTEXT, WM_GETTEXTLENGTH, 0))

    leider bekomme ich als ausgabe imer nur 0...das handle stimmt....was könnte nicht falsch sein? und welche Parameter gibt es noch um die Buttons eventuell besser zu identifizieren?
    lg

    lara
    Hi,

    kann mir denn niemand helfen....ich habe die halbe Nacht probiert es hinzubekommen aber ich bekomme einfach nicht den Text ausgelsen..egal wie ich die Parameter setze....bitte diskutiert mit mir...ich verzweifel schon langsam... könnt ihr mir auch die fragen des letzten postings beantworten..das würde mir sehr helfen..

    lg



    lara

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „musclebreast“ ()

    hi,



    danke..ich habe das alles schon gelesen...und probiere und probiere mir sind die Anwendung dieser beiden Parameter nicht einleuchtend.

    Kann mir das jemand so nett sein und mir das mal genau erklären?
    wParam Specifies the maximum number of TCHARs to be copied, including the terminating null character.
    Windows NT/2000/XP:ANSI applications may have the string in the buffer reduced in size (to a minimum of half that of the wParam value) due to conversion from ANSI to Unicode.

    lParam Pointer to the buffer that is to receive the text.

    lg..



    lara



    Ich kann schon englisch aber weiß auch dass ich dort nicht o reinschreibe..aber was für Parameter sind es...was ist das Ziel...
    hi,



    danke..ich habe das alles schon gelesen...und probiere und probiere mir sind die Anwendung dieser beiden Parameter nicht einleuchtend.

    Kann mir das jemand so nett sein und mir das mal genau erklären?
    wParam Specifies the maximum number of TCHARs to be copied, including the terminating null character.
    Windows NT/2000/XP:ANSI applications may have the string in the buffer reduced in size (to a minimum of half that of the wParam value) due to conversion from ANSI to Unicode.

    lParam Pointer to the buffer that is to receive the text.

    lg..



    lara



    Ich kann schon englisch aber weiß auch dass ich dort nicht o reinschreibe..aber was für Parameter sind es...was ist das Ziel...
    hi,



    danke..ich habe das alles schon gelesen...und probiere und probiere mir sind die Anwendung dieser beiden Parameter nicht einleuchtend.

    Kann mir das jemand so nett sein und mir das mal genau erklären?
    wParam Specifies the maximum number of TCHARs to be copied, including the terminating null character.
    Windows NT/2000/XP:ANSI applications may have the string in the buffer reduced in size (to a minimum of half that of the wParam value) due to conversion from ANSI to Unicode.

    lParam Pointer to the buffer that is to receive the text.

    lg..



    lara



    Ich kann schon englisch aber weiß auch dass ich dort nicht o reinschreibe..aber was für Parameter sind es...was ist das Ziel...
    oh bitte helft mir...

    ich habe es jetzt so weil so muss es sein...

    VB.NET-Quellcode

    1. test1 = (SendMessage(Handle, WM_GETTEXTLENGTH, 0, 0))
    2. SendMessage(Handle, WM_GETTEXT, test1, ????was kommt hier??der buffer aber kann man den vom typ integer anlegen))

    Kann sendmessage für das auslesen von Texten eines chats genutzt werden? wie lege ich den buffer an? beim typ string wäre es mir klar aber darf der wert denn string sein wenn ich ihn so in der declare anweisung setze? eigentlich doch nicht...bitte fragt wenn ihr mich nicht versteht..ich bin gern in dem forum aber im moment mehr als verzeifelt, dass ihr mir nicht helft...ich möchte keine quelltexte sondern nur das ihr mir helft mich weiterzuentwickeln...
    lg

    lara
    hi,



    danke..bei den Buttons bin ich schon weiter..da mache ich eventuell noch einen eigen Thread auf..aber Hal es wäre nett wenn wir das mit dem WM_GetText lösen könnten....:)

    Ich habe dann noch eine generelle Frage. Bei dem chat bekomme ich von allen Elementen die Handles...ich dachte bisher mit den Handles können alle Elemente wie z.B. Button gedrückt werden...aber es geht nicht bei dem chat..kann ein Programm dies sperren das mit Handles darauf zugegriffen wird oder gibs garkeine chance das zu unterscheiden? Weil beim Taschenrechner von Windows kann ich die buttons drücken..bei dem chat nicht...

    lg



    lara
    Also - zu WM_GETTEXT am Beispiel Notepad:

    Zunächst musst du deine Api-Funktionen deklarieren:

    VB.NET-Quellcode

    1. Declare Auto Function GetDlgItem Lib "User32.dll" ( _
    2. ByVal hDlg As Integer, _
    3. ByVal nIDDlgItem As Integer) As IntPtr
    4. 'Überladung für Gettext
    5. Declare Auto Function SendMessage Lib "User32.dll" Alias "SendMessageW" ( _
    6. ByVal hWnd As Integer, _
    7. ByVal Msg As UInt32, _
    8. ByVal wParam As IntPtr, _
    9. ByVal lParam As StringBuilder) As IntPtr
    10. 'Überladung für Gettextlength
    11. Declare Auto Function SendMessage Lib "User32.dll" Alias "SendMessageW" ( _
    12. ByVal hWnd As Integer, _
    13. ByVal Msg As UInt32, _
    14. ByVal wParam As Int32, _
    15. ByVal lParam As Int32) As Int32

    Mit GetDlgItem bekommst du das Handle eines beliebigen Steuerelements (Controls) - hier wollen wir die TextBox des Editors.
    SendMessage sendet eine WM-Nachricht an ein Fenster oder ein Control.
    Dann kommen die Konstanten:

    VB.NET-Quellcode

    1. Const WM_GETTEXT = &HD
    2. Const WM_GETTEXTLENGTH = &HE


    ...Du holst dir das Fensterhandle des Programmfensters (hier der Editor):

    VB.NET-Quellcode

    1. Dim p() As Process = Process.GetProcessesByName("notepad")
    2. Dim hwnd As IntPtr = p(0).MainWindowHandle


    ...Und das TextBox-Handle mit Hilfe des ersten Handles;
    Dazu musst du wissen (aus Spy++), dass die TextBox die ID 15 hat.

    VB.NET-Quellcode

    1. Dim ItemHwnd As IntPtr = GetDlgItem(hwnd, 15)


    Jetzt liest du die Textlänge aus; wParam und lParam müssen 0 sein (laut MSDN):

    VB.NET-Quellcode

    1. Dim length As Int32 = SendMessage(ItemHwnd, WM_GETTEXTLENGTH, 0, 0)


    Mit dieser Info kannst du nun einen StringBuilder mit entsprechender Kapazität erstellen und den eigentlichen Text auslesen;
    Laut MSDN muss wParam die Anzahl der auszulesenden Zeichen und lParam der Ziel-String(Builder) sein:

    VB.NET-Quellcode

    1. Dim lpStr As New System.Text.StringBuilder(length)
    2. SendMessage(ItemHwnd, WM_GETTEXT, length, lpStr)


    Der StringBuilder enthält jetzt den Text, den du mit ToString() anzeigen kannst:

    VB.NET-Quellcode

    1. MessageBox.Show("Inhalt der TextBox:" & vbNewLine & lpStr.ToString())


    Das wars auch schon.

    gruß
    hal2000
    Gruß
    hal2000
    hi hal,



    viel lieben dank für deine mühe. Meine große Frage ist aber wie der stringbuilder definiert ist? Und jetzt hoffe ich du kannst mir rein vom Verständnis helfen. Ich kann die länge von einem Textfenster problemlos auslesen. Das Große Problem ist ein Chat. ich habe definitiv das richtige Handle....aber muss ein Chat anders behandelt werden? denn als länge bekomme ich immer 0.



    Danke dir jetzt schon hal....hast du denn schon prktisch mit Apis gearbeitet? eigentlich gehts ganz gut...aber wenn man das handle hat kann man doch alles tun oder? weil ich kann bei einem Button vom Taschenrechner drücken von windows..bei ICQ geht das z.B. nicht..der Button reagiert nicht...kann der Anbieter die Nutzung von Handles sperren? eigentlich doch nicht oder? ander formuliert...wenn man das handle hat gibt es keine grenzen oder?

    lg



    lara
    Meine große Frage ist aber wie der stringbuilder definiert ist?
    Das ist eine Klasse, die entwickelt wurde, um das Erstellen und Bearbeiten von Strings zu beschleunigen. Wenn du 10000 Strings direkt erzeugst dauert das viel länger als wenn du einen StringBuilder benutzt, der die Methode Append() kennt. String-Objekte werden nämlich bei jeder Änderung komplett neu erstellt, was bei langen Strings Performanceprobleme ergibt. Der StringBuilder umschifft diese Klippe.
    aber muss ein Chat anders behandelt werden?
    Nein, denn es ist ein Fenster wie jedes andere auch.

    denn als länge bekomme ich immer 0
    siehe: msdn.microsoft.com/en-us/library/ms632628(VS.85).aspx
    kann der Anbieter die Nutzung von Handles sperren?
    Nein, aber er kann die Nachrichtenschleife (ggf. teilweise) überschreiben und eine eigene Behandlungsroutine einsetzen, die die WM_GETTEXT-Nachricht ignoriert.
    bei ICQ geht das z.B. nicht
    Weil ICQ über ActiveX auf Internet-Explorer-Komponenten zugreift und dadurch eine Art "Umleitung" nötig wird, um an die Daten zu kommen. Wie das geht? Frag nicht, zu aufwändig. Ich müsste selbst nochmal nachlesen.

    gruß
    hal2000
    Gruß
    hal2000
    hi, danke dir..also wenn ichs richtig verstanden habe geht wm_gettext nur bei statischen Fenstern?

    OKI,

    1. ich habe aber noch dies gefunden im Netz..kann mir evtl. jemanden sagen was dies bedeuten kann. set_text()-Funktion des Chatfensters muss gehooked werden und dann kann man auch den text einlesen...was kann dies bedeuten..habt ihr eine idee?das bedeutet doch dass der chat klar auch eine set_text funktion besitzt und die muss gleich abgefangen werden..ist die möglich?


    2. habt ihr evtl. noch andere api funktionen oder konstanten mit denen ich mal veruchen könnte den chat auszulesen?
    lg



    lara

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „musclebreast“ ()