Zurück   Entwickler-Forum > .NET > VB.NET

Antwort
 
Themen-Optionen Ansicht

Aktiver fenster titel , problem
Alt 30.07.2010, 10:59   #1
xmaniix
Zaungast
 
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
xmaniix befindet sich auf einem aufstrebenden Ast
Standard Aktiver fenster titel , problem

hallo,

Ich müsste bei meinem programm an den titeltext des aktiven windows kommen.. Google ergab folgenden code, und ähnliches doch bekam ich immer nur zahlen ausgaben wie 856329535 ...wisst ihr an was das liegen kann bzw wies vil. richtig gehd ?

Gruß xmanix

Code:
he hWnd of the most recently found window.
Private m_LastHwnd As Integer

Private Sub tmrGetFgWindow_Tick(ByVal sender As _
    System.Object, ByVal e As System.EventArgs) Handles _
    tmrGetFgWindow.Tick
    ' Get the window's handle.
    Dim fg_hwnd As Long = GetForegroundWindow()

    ' If this is the same as the previous foreground window,
    ' let that one remain the most recent entry.
    If m_LastHwnd = fg_hwnd Then Exit Sub
    m_LastHwnd = fg_hwnd

    ' Display the time and the window's title.
    Dim list_item As System.Windows.Forms.ListViewItem
    list_item = _
        lvwFGWindow.Items.Add(Text:=Now.ToString("h:mm:ss"))
    list_item.SubItems.Add(GetWindowTitle(fg_hwnd))
    list_item.EnsureVisible()
End Sub

' Return the window's title.
Private Function GetWindowTitle(ByVal window_hwnd As _
    Integer) As String
    ' See how long the window's title is.
    Dim length As Integer
    length = GetWindowTextLength(window_hwnd) + 1
    If length <= 1 Then
        ' There's no title. Use the hWnd.
        Return "<" & window_hwnd & ">"
    Else
        ' Get the title.
        Dim buf As String = Space$(length)
        length = GetWindowText(window_hwnd, buf, length)
        Return buf.Substring(0, length)
    End If
End Function
  Mit Zitat antworten

Anzeige

Alt 30.07.2010, 11:19   #2
Ralf Jansen
Stammgast
 
Ralf Jansen ist offline
Registriert seit: 26.02.2003
Beiträge: 1.856
Ralf Jansen befindet sich auf einem aufstrebenden Ast
Standard

Wie sieht dein Import der GetWindowText API aus?

Bei mir sähe es so aus.

VB.Net Code:
  1. <DllImport("user32.dll", SetLastError:=True)> _
  2.     Public Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal nMaxCount As Integer) As Integer

Verwendung dann z.B. so (ich habe mir hier erst mal GetWindowTextLength gespart)

VB.Net Code:
  1. Private Function GetWindowTitle(ByVal window_hwnd As Integer) As String
  2.     Dim title As New StringBuilder(256)
  3.     GetWindowText(window_hwnd, title, title.Capacity)
  4.     return title.ToString
  5. End Function
  Mit Zitat antworten

Alt 30.07.2010, 11:32   #3
xmaniix
Zaungast
 
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
xmaniix befindet sich auf einem aufstrebenden Ast
Standard

hallo, danke für die schnelle Antwort !

import habe ich so:

Code:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
ich probiers ob es mit deiner deklaration besser funktioniert..
  Mit Zitat antworten

Alt 30.07.2010, 11:37   #4
xmaniix
Zaungast
 
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
xmaniix befindet sich auf einem aufstrebenden Ast
Standard

so probiert....
Code:
Private Declare Function GetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal lpString As Text.StringBuilder, ByVal nMaxCount As Integer) As Integer

'Aufruf
Private Sub tmrTimer_Tick(ByVal sender As System.Object, _
    ByVal e As System.Timers.ElapsedEventArgs)
        MsgBox(GetWindowTitle(GetForegroundWindow()))
End Sub

Private Function GetWindowTitle(ByVal window_hwnd As Long) As String
        Dim title As New Text.StringBuilder(256)
        GetWindowText(window_hwnd, title, title.Capacity)
        Return title.ToString
    End Function
nun kommt ein arithmetischer Überlauf bei GetWindowText(window_hwnd, title, title.Capacity)


was kann ich machen ?

Gruß xmaniix
  Mit Zitat antworten

Alt 30.07.2010, 11:44   #5
Ralf Jansen
Stammgast
 
Ralf Jansen ist offline
Registriert seit: 26.02.2003
Beiträge: 1.856
Ralf Jansen befindet sich auf einem aufstrebenden Ast
Standard

Liefert dir den GetForegroundWindow() einen gültigen Handle ist die Definition des Stringbuilders mit maximal 256 Zeichen ausreichend? Wie gesagt ich habe den Aufruf von GetWindowTextLength weggelassen.

Ansonsten kannst du für dir richtige Verwendung der API auch immer mal bei PInvoke.net ansehen.
  Mit Zitat antworten

Alt 30.07.2010, 12:04   #6
xmaniix
Zaungast
 
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
xmaniix befindet sich auf einem aufstrebenden Ast
Standard

die GetForeGroundWindow liefert mir z.B. 8598608587692645452
dass führt zu einem Überlauf...

habe keine Ahnung was ich jetzt machen soll damit es funktioniert !

Hast du ne Ahnung ?
  Mit Zitat antworten

Alt 30.07.2010, 12:18   #7
Ralf Jansen
Stammgast
 
Ralf Jansen ist offline
Registriert seit: 26.02.2003
Beiträge: 1.856
Ralf Jansen befindet sich auf einem aufstrebenden Ast
Standard

Wie sieht deine Definition von GetForegroundWindow aus?


Bist du zufällig auf einem 64Bit System? Egal, wenn es um Handles in den verschieden API geht benutze immer IntPtr nicht long, integer, Int32 oder was auch immer. Du weißt nicht ob dein Zielsystem nachher unter 32 oder 64 bit läuft. Und wenn du APIs per PInvoke benutzt nimm nie die Version mit A am Ende. ANSI ist Tod. Wie leben jetzt seit mindestens 1 Jahrzehnt im Unicode Zeitalter. Ignorier einfach das A oder W am Ende der API Funktionen und nimm die Version ohne Postfix. Das Framework wird schon die richtige (Unicode) Version wählen.
  Mit Zitat antworten

Alt 30.07.2010, 12:26   #8
xmaniix
Zaungast
 
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
xmaniix befindet sich auf einem aufstrebenden Ast
Standard

ne ist 32 bit..
also die richtige Deklaration wäre dann
Code:
Private Declare Function GetForegroundWindow Lib "user32.dll" () As IntPtr
für was steht IntPtr oder was macht das ?


bisherige deklaration:
Code:
 Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
    Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

    Private Declare Function GetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal lpString As Text.StringBuilder, ByVal nMaxCount As Integer) As Integer

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
  Mit Zitat antworten

Alt 30.07.2010, 12:51   #9
Ralf Jansen
Stammgast
 
Ralf Jansen ist offline
Registriert seit: 26.02.2003
Beiträge: 1.856
Ralf Jansen befindet sich auf einem aufstrebenden Ast
Standard

Stell dir IntPtr als Alias für Int32 bzw. Int64 je nach Busbreite des Systems vor zur Darstellung von Handles, Pointern etc. Ist letztlich auch nur ein ganz normaler Ganzzahlentyp wie Integer, Long usw. Nur eben nicht mit fester Länge.

Auf deinem 32bit System entspräche IntPtr also in etwa Int32 bzw. dem VB Alias Integer. Dein bisher verwendeter Long(Int64) ist immer 64 bit also eher ungeeignet.
  Mit Zitat antworten

Alt 30.07.2010, 13:40   #10
xmaniix
Zaungast
 
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
xmaniix befindet sich auf einem aufstrebenden Ast
Standard

ok danke für die erklärung..

Ih habe mir die erklärung der getwindowtext angeschaut und da stand, dass falls der return größer als der zu speichernde buffer string ist, er einfach abgeschnitten wird. Jedoch kommt bei mir immer die fehlermeldung bezüglich überlauf.

Ich hab keine ahnung was jez zu machen ist.
Bitte um Hilfe !!

Gruß
  Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu



Alle Zeitangaben in WEZ +2. Es ist jetzt 03:50 Uhr.



© 1995–2009 Software & Support Verlag GmbH. Vervielfältigung nur mit Genehmigung des Verlags.