 |
Aktiver fenster titel , problem |
 |
30.07.2010, 10:59
|
#1
|
|
Zaungast
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
|
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
|
|
|
|
30.07.2010, 11:19
|
#2
|
|
Stammgast
Ralf Jansen ist offline
Registriert seit: 26.02.2003
Beiträge: 1.856
|
Wie sieht dein Import der GetWindowText API aus?
Bei mir sähe es so aus.
VB.Net Code:
<DllImport("user32.dll", SetLastError:=True)> _ 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:
Private Function GetWindowTitle(ByVal window_hwnd As Integer) As String Dim title As New StringBuilder(256) GetWindowText(window_hwnd, title, title.Capacity) return title.ToString End Function
|
|
|
|
30.07.2010, 11:32
|
#3
|
|
Zaungast
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
|
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..
|
|
|
|
30.07.2010, 11:37
|
#4
|
|
Zaungast
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
|
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
|
|
|
|
30.07.2010, 11:44
|
#5
|
|
Stammgast
Ralf Jansen ist offline
Registriert seit: 26.02.2003
Beiträge: 1.856
|
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.
|
|
|
|
30.07.2010, 12:04
|
#6
|
|
Zaungast
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
|
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 ?
|
|
|
|
30.07.2010, 12:18
|
#7
|
|
Stammgast
Ralf Jansen ist offline
Registriert seit: 26.02.2003
Beiträge: 1.856
|
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.
|
|
|
|
30.07.2010, 12:26
|
#8
|
|
Zaungast
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
|
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
|
|
|
|
30.07.2010, 12:51
|
#9
|
|
Stammgast
Ralf Jansen ist offline
Registriert seit: 26.02.2003
Beiträge: 1.856
|
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.
|
|
|
|
30.07.2010, 13:40
|
#10
|
|
Zaungast
xmaniix ist offline
Registriert seit: 28.06.2010
Ort: Bischofshofen
Beiträge: 31
|
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ß
|
|
|
|
| Themen-Optionen |
|
|
| Ansicht |
Linear-Darstellung
|
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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 03:50 Uhr.
|