Hallo allerseits,
Ich hoffe hierdurch Hilfe bei meinem Problem zu erhalten. Danke schon mal im Voraus.
Ich versuche den Wert eines Controls aus einem externen Programm auszulesen. Hierfür verwende ich das Tool "WinSpy 2008". Mit WinSpy 2008 kann man ein Control anklicken und es generiert einen Code um das Handle des Controls ausfindig zu machen. Das habe ich gemacht und erhalte diesen Code:
var
wndMain, wndChild: HWND;
begin
wndMain := FindWindow('ArFrame','BMC Remedy User');
if wndMain <> 0 then
begin
wndChild := FindWindowEx(wndMain, 0, 'MDIClient', nil);
wndChild := FindWindowEx(wndChild, 0, _
'Afx:00400000:b:00000000:00000006:000106F3', nil);
wndChild := FindWindowEx(wndChild, 0, 'AfxMDIFrame70', nil);
wndChild := FindWindowEx(wndChild, 0, 'AfxFrameOrView70', nil);
wndChild := FindWindowEx(wndChild, 0, 'RichEdit20A', nil);
if wndChild <> 0 then
begin
ShowMessage('Window Handle: ' + IntToStr(wndChild));
FlashControl(wndChild); // internal function
end;
end;
end. Den Code kann man dann gleich ausführen und er funktioniert auch. Jetzt wollte ich das ganze mit VB.net programmieren. Ich testweise nach jedem FindWindowEx eine MsgBox(wndChild) gesetzt, mein Handle ist ab dem Control "MDIClient" falsch.
Hier mein VBCode:
Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As _
String, ByVal lpWindowName As String) As IntPtr
Declare Function FindWindowEx Lib "USER32.DLL" Alias "FindWindowExA" (ByVal _
hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpszClass As _
String, ByVal lpszWindow As String) As Long
Private Declare Function SendMessageByInt Lib "user32.dll" Alias _
"SendMessageA" (ByVal hWnd As IntPtr, ByVal uMsg As Integer, ByVal wParam _
As Integer, ByVal lParam As Integer) As Integer
Private Declare Function SendMessageByString Lib "user32.dll" Alias _
"SendMessageA" (ByVal hWnd As IntPtr, ByVal uMsg As Integer, ByVal wParam _
As Integer, ByVal lParam As StringBuilder) As Integer
Const WM_GETTEXT As Integer = &HD
Const WM_GETTEXTLENGTH As Integer = &HE
Public Shared Function GetArsNumber()
Dim wndMain, wndChild As Long
wndMain = FindWindow("ArFrame", "BMC Remedy User")
wndChild = FindWindowEx(wndMain, 0, "MDIClient", vbNullString)
wndChild = FindWindowEx(wndChild, 0, _
"Afx:00400000:b:00000000:00000006:000106F3", vbNullString)
wndChild = FindWindowEx(wndChild, 0, "AfxMDIFrame70", vbNullString)
wndChild = FindWindowEx(wndChild, 0, "AfxFrameOrView70", vbNullString)
wndChild = FindWindowEx(wndChild, 0, "RichEdit20A", vbNullString)
MsgBox(wndChild.ToString)
Return (GetText(wndChild))
End Function
Public Shared Function GetText(ByVal hwnd As IntPtr) As String
If (Not hwnd.Equals(IntPtr.Zero)) Then
Dim length As Integer = SendMessageByInt(hwnd, WM_GETTEXTLENGTH, 0, _
0)
If length > 0 Then
Dim SB As New StringBuilder(length)
Dim Result As Int32 = SendMessageByString(hwnd, WM_GETTEXT, _
length + 1, SB)
If Result <> 0 Then
Return SB.ToString()
Else
Return String.Empty
End If
Else
Return "Kein Text vorhanden"
End If
Else
Return "Handle nicht gefunden"
End If
End Function Ab dem "MDIClient" kommt mir mit MsgBoxen nach jedem FindWindowEx eine geschätzt 20-stellige Zahl raus.
Danke für eure Zeit,
Ciao,
oimel |