Also, jetzt klappt es eigentlich schon ganz gut, wenn es ein Edit oder ein Button ist... bei einigen Controls bekomme ich jedoch noch nicht einmal den Klassennamen
Ich hab mir jetzt erst einmal eine Funktion gebastelt, die mir onTimer1 den gerade aktiven Klassennamen und den dazu gehörenden Text in eine ListView schreibt:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
AppHWnd: HWND;
ThreadId: DWORD;
FocusHWnd: HWND;
ClassName: string;
S0, S1: string;
begin
Timer1.Enabled := False;
FocusHWnd := GetFocus;
if not IsWindow(FocusHWnd) then
begin
AppHWnd := GetForegroundWindow;
if AppHWnd <> Self.Handle then
begin
ThreadId := GetWindowThreadProcessId(AppHWnd, nil);
if ThreadId <> 0 then
if AttachThreadInput(GetCurrentThreadId, ThreadId, True) then
begin
FocusHWnd := GetFocus;
AttachThreadInput(GetCurrentThreadId, ThreadId, False);
SetLength(ClassName, 512);
SetLength(ClassName, GetClassName(FocusHWnd, PChar(ClassName),
Length(ClassName)));
SetLength(S0, SendMessage(FocusHWnd, WM_GETTEXTLENGTH, 0, 0) + 1);
if Length(S0) > 1 then
begin
Application.ProcessMessages;
SetLength(S0, SendMessage(FocusHWnd, WM_GETTEXT, Length(S0),
LPARAM(PChar(S0))));
S1 := StringReplace(S0, '###Hierhin###', 'Neuer Text',
[rfReplaceAll]);
if S0 <> S1 then
SendMessage(FocusHWnd, WM_SETTEXT, Length(S1), LPARAM(PChar(S1)));
end;
end;
end;
end;
if (ListView1.Items.Count = 0) or (ListView1.Items[ListView1.Items.Count -
1].Caption <> IntToStr(FocusHWnd) + '[' + ClassName + ']="' + Trim(S0) + '"')
then
begin
ListView1.Items.BeginUpdate;
ListView1.Items.Add;
ListView1.Items[ListView1.Items.Count - 1].Caption := IntToStr(FocusHWnd) +
'[' + ClassName + ']="' + Trim(S0) + '"';
ListView1.Items[ListView1.Items.Count - 1].MakeVisible(False);
ListView1.Items.EndUpdate;
end;
Timer1.Enabled := True;
end;
Klassen wo es nicht funzt:
"_WwG" (Word XP)
"TEditControl" (Delphi2005, Code)
"Internet Exploerer_Server" (IE)
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.