
Zitat von
toms:
Ok, bin gespannt darauf...
Das ganze läuft dann über einen
COM-Server.. dauert aber wie gesagt sicher noch länger..!
Zitat:
Dennoch sollte jetzt die "No Debug-Privilege" Meldung nicht bei jedem Start kommen, denn
nach der 1. Meldung weiss man's...

Ja, ich hab mir schon gedacht, dass ich eine Checkbox "Don't show this message again" einbau...
Zitat:
Habe noch einen weiteren Fehler im FindWindow Code gefunden:
Fensterstruktur:
Delphi-Quellcode:
1770508: TAppBuilder "Delphi 6 - Project1"
1967222: TControlBar
1311916: TDockToolBar "Standard"
Generierter FindWindow Code von XSpy:
Delphi-Quellcode:
var
wnd: HWND;
begin
wnd := FindWindow('TAppBuilder', 'Delphi 6 - Project1');
wnd := FindWindowEx(wnd, 0, 'TControlBar', nil);
wnd := FindWindowEx(wnd, 0, 'TDockToolBar', 'Standard');
if wnd <> 0 then
begin
end;
end;
TDockToolBar wird nicht gefunden, warum?
Die Antwort auf die Frage überlasse ich dir...
Hab mal bisschen rumprobiert und festgestellt, dass das an den FindWindow(Ex)-APIs liegt.. hab mir jetzt mal meinen eigenen Ersatz geschrieben, mit dem gehts:
Delphi-Quellcode:
function XSpy_FindWindowEx(WndParent: HWND; WndChildAfter: HWND;
lpszClass: PChar; lpszWindow: PChar): HWND;
type
TEnumWndRec = record
lpszClass: PChar;
lpszWindow: PChar;
Wnd: HWND;
WndParent: HWND;
WndChildAfter: HWND;
bChildFound: Boolean;
end;
var
aEnumWndRec: TEnumWndRec;
function GetClassName(Wnd: HWND): String;
var
szBuffer: array [0..255] of Char;
begin
ZeroMemory(@szBuffer, SizeOf(szBuffer));
Windows.GetClassName(Wnd, szBuffer, SizeOf(szBuffer));
Result := String(szBuffer);
end;
function GetWindowText(Wnd: HWND): String;
var
dwResult: DWord;
pBuffer: PChar;
begin
dwResult := SendMessage(Wnd, WM_GETTEXTLENGTH, 0, 0) + 1;
pBuffer := GetMemory(dwResult);
try
SendMessage(Wnd, WM_GETTEXT, dwResult, Integer(pBuffer));
Result := String(pBuffer);
finally
FreeMemory(pBuffer);
end;
end;
function EnumCallBack(Window: HWND; var aRec: TEnumWndRec): Boolean; stdcall;
var
bMatches: Boolean;
begin
Result := True;
if (aRec.WndParent <> 0) and
(aRec.WndParent <> GetAncestor(Window, GA_PARENT)) then
Exit;
if (aRec.WndChildAfter <> 0) and not aRec.bChildFound then
begin
aRec.bChildFound := aRec.WndChildAfter = Window;
Exit;
end;
bMatches := True;
if Assigned(aRec.lpszClass) then
bMatches := String(aRec.lpszClass) = GetClassName(Window);
if bMatches and Assigned(aRec.lpszWindow) then
bMatches := String(aRec.lpszWindow) = GetWindowText(Window);
if bMatches then
begin
aRec.Wnd := Window;
Result := False;
end;
end;
begin
Result := 0;
if (WndParent <> 0) and not IsWindow(WndParent) then
Exit;
aEnumWndRec.lpszClass := lpszClass;
aEnumWndRec.lpszWindow := lpszWindow;
aEnumWndRec.Wnd := 0;
aEnumWndRec.WndParent := WndParent;
aEnumWndRec.WndChildAfter := WndChildAfter;
aEnumWndRec.bChildFound := False;
if WndParent = 0 then
EnumWindows(@EnumCallBack, Integer(@aEnumWndRec))
else
EnumChildWindows(WndParent, @EnumCallBack, Integer(@aEnumWndRec));
Result := aEnumWndRec.Wnd;
end;
PS: ich hab mal geschaut was dein WinSpy für einen Code für genau dieses Fenster produziert... der generierte Code findet zwar ein Fenster, aber das falsche..!

Das gesuchte Fenster hat ChildNr 6 statt 5...