Moin zusammen!
Ich versuche gerade die GetCurrentUrl-Prozedur aus
diesem Beitrag in einem Service zu packen.
Hintergrund ist, dass ich überwachen möchte wann welche Internetseite aufgerufen wird. Idealerweise möchte ich
URL und Title loggen,
URL alleine würde aber auch gehen.
Das Problem ist ja, dass ich aus dem Service heraus auf den Desktop des Users (WinSta0\default) zugreifen muss. Der Desktop reicht, weil an dem entsprechenden Rechner nur ein Benutzer angemeldet ist, die schnelle Benutzerumschaltung aus und auch ein Autologon.
Nun, das Öffnen der WindowStation, des Desktops und ein EnumDesktopWindows funktionieren einwandfrei. Nur das GetCurrentUrl nicht. Habe auch schon versucht vorher SetProcessWindowStation und SetThreadDesktop aufzurufen, das hilft aber leider nichts.
Kann ich GetCurrentUrl in einem Service komplett vergessen, weil es
DDE nutzt? Gibt es sonst eine Möglichkeit, z.B. per
Handle des Browser, die aktuelle
URL auszulesen?
Delphi-Quellcode:
wsHandle := OpenWindowStation('
WinSta0', true, WINSTA_ACCESSCLIPBOARD
or
WINSTA_ENUMDESKTOPS
or
WINSTA_ENUMERATE
or
WINSTA_READATTRIBUTES
or
WINSTA_READSCREEN);
if wsHandle <> 0
then
begin
dHandle := OpenDesktop('
Default', 1, false,
DESKTOP_ENUMERATE
or
DESKTOP_HOOKCONTROL
or
DESKTOP_READOBJECTS
or
DESKTOP_SWITCHDESKTOP);
if dHandle <> 0
then
begin
sl := TStringList.Create;
try
sl.Duplicates := dupIgnore;
EnumDesktopWindows(dHandle, @EnumWindowCallback, Integer(sl));
sl.SaveToFile('
c:\liste.txt');
if SetProcessWindowStation(wsHandle) <> 0
then
if SetThreadDesktop(dHandle) <> 0
then
GetCurrentUrl(
url, title);
//< - -Hier steigt der Service aus
if (trim(
url) <> '
')
or (trim(title) <> '
')
then
begin
sl.Clear;
sl.Add(
url + '
: ' + title);
sl.SaveToFile('
c:\urls.txt');
end;
sleep(5000);
finally
FreeAndNil(sl);
end;
end;
end;