[Win32/Delphi] Hidden IE sluit automatisch *

Pagina: 1
Acties:

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Ik zit met een vaag probleem.
Ik heb een programma gemaakt die Internet Explorer opstart, en de WndProc daarvan vervangt door 1tje van mijn programma (in een DLL). Deze is dus gesubclassed.

Nu is het zo dat als ik Internet Explorer opgestart heb, maakt ie `m SW_HIDE, zodat je m niet ziet op je desktop.
Maar zodra je in een ander IE venster (maakt totaal niet uit welke) een link opent die in een nieuw scherm geopend wordt, worden alle IE instanties die SW_HIDE zijn gesloten.
Het zijn allemaal losse instanties van IExplore.exe, maar toch worden ze allemaal afgesloten bij deze actie.
Als ik ze namelijk SW_MINIMIZED doe blijven ze wel staan.

Wat ik van plan was, is om deze 'actie' die langs mijn WndProc gaat, te filteren. Maar ik kan er niet achter komen welke WParam (het commando) daar bij hoort. Met OutputDebugString zie ik wel welke er langs komen, maar het zijn elke keer andere op 1 na.
-1610285054, maar dat is `m niet.
Ik denk dat het komt omdat hij 2 commando`s tegelijk kan sturen en dus die 2 bij elkaar optelt?? Zo niet, dan is het lastig omdat het telkens andere codes zijn.

Tevens is het wél zo dat hij maar 3 verschillende heeft per keer.
Maar elke keer zijn dat wel 3 anderen, op die ene na dus.

Kan iemand me hier een beetje bij helpen? Bij voorbaat heel erg bedankt.

[ Voor 6% gewijzigd door Guillome op 30-01-2004 16:30 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • WildernessChild
  • Registratie: Februari 2002
  • Niet online

WildernessChild

Voor al uw hersenspinsels

Moet je niet kijken naar de message zelf in plaats van z'n WParam? Die kan namelijk best een pointer of een handle bevatten die telkens anders is, terwijl de gestuurde message wel dezelfde is...

Maker van Taekwindow; verplaats en resize je vensters met de Alt-toets!


  • Guillome
  • Registratie: Januari 2001
  • Niet online
DebugView geeft de volgende Messages door, deze komen allemaal door de WndProc bij het openen van een link. Hierdoor worden de hidden vensters gesloten.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[1620] Msg = 1801  WParam = 0  LParam = 832
[1620] Msg = 70  WParam = 0  LParam = 1239848
[1620] Msg = 71  WParam = 0  LParam = 1239848
[1620] Msg = 3  WParam = 0  LParam = 656877332
[1620] Msg = 528  WParam = -1610285054  LParam = 8782806
[1620] Msg = 528  WParam = 2  LParam = 7537502
[1620] Msg = 7  WParam = 7537502  LParam = 0
[1620] Msg = 8  WParam = 7537502  LParam = 0
[1620] Msg = 7  WParam = 7537502  LParam = 0
[1620] Msg = 8  WParam = 7537502  LParam = 0
[1620] Msg = 7  WParam = 7537502  LParam = 0
[1620] Msg = 8  WParam = 7537502  LParam = 0
[1620] Msg = 128  WParam = 0  LParam = 0
[1620] Msg = 128  WParam = 1  LParam = 0
[1620] Msg = 2  WParam = 0  LParam = 0
[1620] Msg = 130  WParam = 0  LParam = 0


De Messages (dus de LParam en WParam niet) zijn elke keer precies zo het zelfde

2 = WM_DESTROY
3 = WM_MOVE
6 = WM_ACTIVATE
7 = WM_SETFOCUS
8 = WM_KILLFOCUS
28 = WM_ACTIVATEAPP
70 = WM_WINDOWPOSCHANGING
71 = WM_WINDOWPOSCHANGED
128 = WM_SETICON
130 = WM_NCDESTROY
134 = WM_NCACTIVATE
528 = WM_PARENTNOTIFY

[ Voor 126% gewijzigd door Guillome op 30-01-2004 21:09 ]

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 23:42

BoomSmurf

Am-Ende!

XLerator schreef op 30 januari 2004 @ 19:58:

code:
1
2
[1620] Msg = 2  WParam = 0  LParam = 0
[1620] Msg = 130  WParam = 0  LParam = 0


2 = WM_DESTROY
130 = WM_NCDESTROY
Als je eens begint met deze twee eruit te filteren

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Dat helpt helaas ook niet

En dit kan denk ik ook niet, omdat het scherm nog wel te sluiten moet zijn door mijn programma. Dat kan misschien met een omweggetje wel, maar dit werkt dus nog niet.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
function WndProc(Wnd: HWND; Msg, WParam, LParam: Longint): Longint; stdcall;
var
  PID: DWORD;
  LocalLastUsed: Word;
begin
//  OutputDebugString('WndProc');
  //OutputDebugString(PChar('Msg = ' + IntToStr(Msg) + '  WParam = ' + IntToStr(WParam) + '  LParam = ' + IntToStr(LParam)));
  If (Msg = 2) or (Msg = 130) Then Begin Result := 0; Exit; End;
  LocalLastUsed := getSetLastUsed(Wnd);
  with GHookRecPtr^.Hooks[LocalLastUsed] do
  begin
//    OutputDebugString(PChar('WndProc - Wnd:' + IntToStr(Wnd) + ' LastUsed:' + IntToStr(LocalLastUsed)));
    if (RObservedWindow = 0) and (RWantProcessID > 0) then
    begin
      GetWindowThreadProcessId(Wnd, @PID);
      if PID <> RWantProcessID then
      begin
//        OutputDebugString(PChar('UnSubclass 1'));
        Result := CallWindowProcW(GOldWndProc, Wnd, Msg, WParam, LParam);
        UnSubClass;//(Wnd);
        Exit;
      end else
      begin
        RObservedWindow := Wnd;
        NotifyObserver(NO_ProcessIDFound, LongInt(Wnd));
      end;
    end;
  //  If MustUnSubClass Then OutputDebugString(PChar('MustUnSubClass')) Else OutputDebugString(PChar('Not MustUnSubClass'));
//    OutputDebugString(PChar(IntToStr(LocalLastUsed)));
    if (MustUnSubClass) then
    begin
//      OutputDebugString(PChar('UnSubclass 2'));
      Result := CallWindowProcW(GOldWndProc, Wnd, Msg, WParam, LParam);
      UnSubClass;//(Wnd);
      Exit;
    end;
  //  OutputDebugString(PChar(IntToStr(LocalLastUsed)));
    case Msg of
      WM_NULL:
        if (WParam = $15) and (LParam = $15) then
        begin        
//          OutputDebugString(PChar('UnSubclass 3'));
          UnSubClass;//(Wnd);
          Result := 0;
          Exit;
        end;
      WM_SYSCOMMAND:
      Begin
        if (WParam = SC_CLOSE) or (WParam = 61539) then
        begin
          GHookRecPtr.LastUsed := LocalLastUsed;
     //     OutputDebugString(PChar('Sluiten ' + IntToStr(LocalLastUsed)));
          NotifyObserver(NO_ClosePrevented, LongInt(Msg));
          Result := 0;  
          Exit;    
        end else
        If (WParam = SC_MINIMIZE) Then
        Begin
          PostMessage(GHookRecPtr.RObserver, WM_HCBT_MINMAX, Wnd, lParam);
        End;
      End;
      WM_COMMAND:
        if (WParam = 40993) or (WParam = 106529) then
        begin
          GHookRecPtr.LastUsed := LocalLastUsed;
          NotifyObserver(NO_ClosePrevented, LongInt(Msg));
          Result := 0;  
          Exit;
        end;
    end;
    Result := CallWindowProcW(GOldWndProc, Wnd, Msg, WParam, LParam);
  end;
end;

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 23:42

BoomSmurf

Am-Ende!

Effe wat nagelezen:

Message 528 (WM_PARENTNOTIFY) wordt ook verstuurd als de window gedestroyed wordt.

Zoals je ziet is de WParam daar 2, wat staat voor WM_DESTROY. Ofwel, VOOR dat punt is je window al bezig met destroyen.

Ik vraag me nu af wat 1801 is...

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Ik heb ze nu alle 3 eruit gefilterd, dus hier moet de message tussen zitten:

code:
1
2
3
4
5
6
7
8
9
10
11
12
[1680] Msg = 1801  WParam = 0  LParam = 1536
[1680] Msg = 70  WParam = 0  LParam = 1239848
[1680] Msg = 71  WParam = 0  LParam = 1239848
[1680] Msg = 3  WParam = 0  LParam = 656877332
[1680] Msg = 7  WParam = 721982  LParam = 0
[1680] Msg = 8  WParam = 721982  LParam = 0
[1680] Msg = 7  WParam = 721982  LParam = 0
[1680] Msg = 8  WParam = 721982  LParam = 0
[1680] Msg = 7  WParam = 721982  LParam = 0
[1680] Msg = 8  WParam = 721982  LParam = 0
[1680] Msg = 128  WParam = 0  LParam = 0
[1680] Msg = 128  WParam = 1  LParam = 0


Maar nix hiervan is een sluit message. Misschien de 1801 waarvan ik neit weet wat ie doet.

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 23:42

BoomSmurf

Am-Ende!

Ik heb ze nu alle 3 eruit gefilterd, dus hier moet de message tussen zitten:
WM_PARENTNOTIFY eruit filteren is een typisch geval van symptoonbestrijding ;) Deze wordt verstuurd als GEVOLG van het gaan sluiten van de window. Ik zou die 1801 eens proberen, en als dat niet werkt 1 voor 1 alle andere, je weet immers niet wat die messages intern doen.

Het zou natuurlijk ook kunnen dat het sluiten niet het gevolg is van iets in de messageloop.

  • Guillome
  • Registratie: Januari 2001
  • Niet online
Zoals het lijkt is het de 1801, vaag he :)
En het is helemaal vaag als je weet dat ik dit al eerder geprobeerd heb om die eruit te filteren. Maar toen werkte het niet, dus ik juich nog niet te vroeg :)
Bedankt iig tot zover!

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • Guillome
  • Registratie: Januari 2001
  • Niet online
Nu heb ik alleen nog een vraag hoe ik alle geloade capture.DLL`s (mijn dll dus) kan unloaden en verwijderen bij het sluiten van mijn app.
Het komt nogal eens voor dat de dll blijft staan, omdat hij ook geattached is aan een losstaande window. En dan wordt hij dus niet geunload.

FreeLibrary werkt niet (denk ik) omdat ik geen loadlibrary gebruik.

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Dat kan niet. Je moet wachten tot windows m los laat.

We adore chaos because we like to restore order - M.C. Escher


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 23:42

BoomSmurf

Am-Ende!

XLerator schreef op 03 februari 2004 @ 13:26:
Nu heb ik alleen nog een vraag hoe ik alle geloade capture.DLL`s (mijn dll dus) kan unloaden en verwijderen bij het sluiten van mijn app.
Het komt nogal eens voor dat de dll blijft staan, omdat hij ook geattached is aan een losstaande window. En dan wordt hij dus niet geunload.

FreeLibrary werkt niet (denk ik) omdat ik geen loadlibrary gebruik.
Ik weet natuurlijk de in's en out's van je prog niet, maar ik neem aan dat je DLL door IE geladen wordt dmv SetWindowHook(Ex) ? In dat geval heb je ook z'n tegenhanger ReleaseWindowHook :)

[ Voor 2% gewijzigd door BoomSmurf op 03-02-2004 14:55 . Reden: -s ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Als de DLL injecteerd wordt in het andere process, zoals bijvoorbeeld bij SetWindowHook, kan alleen het process waarbij die geinjecteerd is m vrijgeven. Maar aangezien die er niet vanaf weet wordt het een beetje lastig.

We adore chaos because we like to restore order - M.C. Escher


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 23:42

BoomSmurf

Am-Ende!

LordLarry schreef op 03 februari 2004 @ 15:23:
Als de DLL injecteerd wordt in het andere process, zoals bijvoorbeeld bij SetWindowHook, kan alleen het process waarbij die geinjecteerd is m vrijgeven. Maar aangezien die er niet vanaf weet wordt het een beetje lastig.
Is gewoon niet waar, iig niet als je het als volgt doet, zo doe ik het zelf iig altijd als ik een ander proces wil subclassen:

Geinjecteerde DLL
- LozeHookProc die niets doet behalve de volgende hook aanroepen
- In attach: checken of het 'parent' process diegene is die je wilt subclassen en dan wndproc vervangen
- In detach: checken of het 'parent' process diegene is die je wilt subclassen en dan wndproc terugzetten

Loader app
- @Create (dit is geen compilebare code ;))
code:
1
2
3
4
5
6
7
8
9
10
11
12
PID := GetWindowThreadProcessId(<targetwindow>);
LibID := LoadLibrary(InjectDLL);
// DLL wordt hier ook al geladen daarom in DLL checken of 
// 'parent' process wel diegene is die je wilt subclassen

if LibID <> 0 then begin
  HookProc := GetProcAddress(LibID, 'LozeHookProc');

  if HookProc <> nil then
    HookID := SetWindowsHookEx(WH_GETMESSAGE, HookProc, LibID, PID);
    // Hier wordt de DLL geinjecteerd in PID
end;

- @Destroy
code:
1
2
3
4
if HookID <> 0 then
  UnhookWindowsHookEx(HookID);
if LibID <> 0 then
  FreeLibrary(LibID);


De DLL wordt hier door het gesubclasste proces WEL DEGELIJK vrijgegeven. En wel op het moment dat jij in je Loader app FreeLibrary aanroept. Waarom dit is, geen flauw idee, maar het werkt iig ZEKER WEL. (Ik subclass momenteel het meeste explorer, je denkt toch niet dat ik die elke keer af ga sluiten en opnieuw op ga starten voor elke recompile of wel dan? ;))

[ Voor 4% gewijzigd door BoomSmurf op 03-02-2004 15:42 . Reden: layout verneukt ]


  • Guillome
  • Registratie: Januari 2001
  • Niet online
Maar ik gebruik geen loadlibrary.
Ik doe het als volgt:

Bovenin de main app
code:
1
2
3
4
5
6
7
8
9
{$R *.DFM}

procedure SetHook; external 'Capture.dll';
procedure UnSetHook(Handle: HWnd); external 'Capture.dll';
procedure SetObserver(Handle: HWnd); external 'Capture.dll';
procedure SetWantProcessID(ID : Integer; AProcessID: DWORD); external 'Capture.dll';
function getHandle(ID : Integer) : THandle; external 'Capture.dll';
function getLastUsed : Integer; external 'Capture.dll';
function getProcessID : Integer; external 'Capture.dll';


Het starten van IE
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure TForm2.StartApp(url: String; Visible: Boolean);
var ProcessID: DWORD;
    tmpRun: String;
begin
  If Not StartHooking Then exit;
  { Start IE }
  If url = '' Then tmpRun := IexplorerPath Else tmpRun := IexplorerPath + ' "' + url + '"';
  if ExecuteProg(tmpRun, Visible, ProcessID) then
  begin
    { Geef het process id door aan de dll }
    SetWantProcessID(GetLastUsed, ProcessID);
    ListBox1.Items.Add(Format('Started hooking, ProcessID = %d', [ProcessID]));
    FHooking := True;
  end else
  Begin
    StopHooking(getLastUsed);
    ShowMessage('Fout bij het starten van "' + IexplorerPath + '".');
  End;
End;

If then else matters! - I5 12600KF, Asus Tuf GT501, Gigabyte Gaming OC 16G 5080 RTX, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router

Pagina: 1