Autor Beitrag
Tana´Ri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Fr 12.12.03 09:35 
Hi Leute,

Background: AutoRun CD per Autorun.Inf und mit Starter.exe

ich bin gerade dabei mein InstallShield Wizard etwas aufzumotzen, d.h. ich habe eine html appliktation im hintergrund und möchte aber nun realisieren das mein Setup [Delphi 6 Enterprise, Win2k], solange es nicht abgeschlossen ist, das einzige Fenster im Vordergund ist; deshalb möchte ich auch temporär die Setforegroundwindow Fkt für alle anderen sperren. Meine Starter.Exe (für die autorun.inf) ist eine konsolenanwendung.
Gibt es vielleicht noch eine andere Möglichkeit das zu realisieren ?

Leider scheitert LockSetForegroundWindow Fkt und zeigt keine Wirkung.

_________________
mfg
Tana´Ri
Tana´Ri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Fr 12.12.03 12:12 
Habs auf ner anderen Art gelöst.

Hier mein Code

ausblenden volle Höhe Delphi-Quelltext
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:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
program starter;

// -------------------------------------------------------------------------- //

{$APPTYPE GUI}

// -------------------------------------------------------------------------- //

uses Windows, SysUtils, TlHelp32, Variants, ComObj, ActiveX, ShDocVw, ShellAPI;

// -------------------------------------------------------------------------- //

function IsTaskbarAutoHideOn : boolean;
 var
  ABData : TAppBarData;
 begin
  ABData.cbSize := sizeof(ABData);
  Result :=(SHAppBarMessage(ABM_GETSTATE, ABData) and ABS_AUTOHIDE) > 0;
end;

// -------------------------------------------------------------------------- //

var
     hProcess,
     FSnapshotHandle : THandle;
     FProcessEntry32 : TProcessEntry32;
     IE              : IWebBrowser2;
     Flags,
     TargetFrameName,
     PostData,
     Headers         : OleVariant;
     ExePath,
     HtmlPath        : String;

Begin { ---------------------------- MAIN ------------------------------------ }
 { Wenn Taskbar nicht automatisch in Hintergrund geht -> command it }
 if not IsTaskbarAutoHideOn then ShowWindow(FindWindow('Shell_TrayWnd'nil), SW_HIDE);
 try
  if ParamStr(1) <> '' then ExePath := ParamStr(1else ExePath := DEFAULTEXE;
  if ParamStr(2) <> '' then HtmlPath := ParamStr(2else HtmlPath := ExtractFilePath(ParamStr(0))+DEFAULTHTML;
  { ^^ Anmerkung zu HtmlPath im Aufruf Navigate funktioniert nicht mit relativen Pfäden } 
  { Pfad zur Exe File, muss vorhanden sein ! }
  if FileExists(ExePath) then
    { Pfad zur Html File, muss vorhanden sein ! }
    if FileExists(HtmlPath) then
     begin
      { Send to keyboard inputstream Windowstaste + D -> minimieren aller fenster }
      keybd_event(VK_LWIN, 000);
      keybd_event(68000);
      keybd_event(680, KEYEVENTF_KEYUP, 0);
      keybd_event(VK_LWIN, 0,KEYEVENTF_KEYUP, 0);
     { Initialisierung der COM Library }
     CoInitialize(NIL);
     try
      IE := CreateOleObject('InternetExplorer.Application'as IWebBrowser2;
      IE.MenuBar := False;
      IE.AddressBar := false;
      IE.Resizable := false;
      IE.StatusBar := false;
      IE.ToolBar := 0;
      IE.FullScreen := True;
      Flags := 8;
      IE.Navigate(HtmlPath,Flags,TargetFrameName,PostData,Headers);
      { Disable Input for htmlpage }
      EnableWindow(IE.HWND,FALSE);
      { Show Html | Backround }
      IE.Visible := True;
      { Start des Setup´s }
      ShellExecute(0'open', PChar(ExePath), NIL'', SW_SHOW);
      { SnapShot der aktuellen Prozesse }
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS or TH32CS_SNAPMODULE, 0);
       try
        { Die Recordgröße in das Record spezifische Feld (Erkennungsfeld) eintragen }
        FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
        { Erster Prozess SnapShot }
        if Process32First(FSnapshotHandle, FProcessEntry32) then
        { Schleifen Durchlauf der Prozesse }
        repeat
         { Abfrage ob SnapShot dem gesuchten entspricht }
         if (UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExtractFileName(ExePath))) or
            (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExePath)) then
          begin
           { Gesuchter Prozess gefunden -> ermitteln des Handle }
           hProcess := OpenProcess(PROCESS_ALL_ACCESS, BOOL(0), FProcessEntry32.th32ProcessID);
           { Wenn Handle Ok }
           if hProcess <> INVALID_HANDLE_VALUE AND 0 then
            try
             { Warte bis der Process beendet ist }
             WaitForSingleObject(hProcess,INFINITE);
            finally
             { Schließe Prozess-Handle }
             CloseHandle(hProcess);
            end;
           { Breche aus der Schleife aus }
           Break;
         end;
        { Abbruchbedingung der Schleife }
        until not Process32Next(FSnapshotHandle, FProcessEntry32);
       finally
        { SnapShot Handle freigeben }
        CloseHandle(FSnapshotHandle);
       end;
     finally
      { OleVriant freigabe }
      Flags            := unassigned;
      TargetFrameName  := unassigned;
      PostData         := unassigned;
      Headers          := unassigned;
      { IWebBrowser2 Terminierung }
      IE.Quit;
     end;
     { COM Library entladen }
     CoUnInitialize;
    end;
 finally
  { Zum Schluss zeig die Taskbar wieder }
  if not IsTaskbarAutoHideOn then ShowWindow(FindWindow('Shell_TrayWnd'nil), SW_SHOW);
 end;
End.

_________________
mfg
Tana´Ri
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 12.12.03 15:08 
Wie wäre es wenn du anstatt dem ShellExecute + ToolHelp32 ein CreateProcess verwenden würdest?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  ProcessInfo: TProcessInformation;
  StartupInfo: TStartupInfo;
begin
  StartupInfo.cb := SizeOf(StartupInfo);
  GetStartupInfo(StartupInfo);
  if CreateProcess(nil, PChar(ExeFile), nilnil, True, 0nilnil, StartupInfo, ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread); // wird nicht benötigt
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end;
end;

Das spaar einiges an Rechenaufwand, der durch die ToolHelp32 Funktionen verbraucht wird,

_________________
Ist Zeit wirklich Geld?
Tana´Ri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 230



BeitragVerfasst: Mi 17.12.03 10:49 
stimmt nen OpenProcess hab ich ja sowieso schon drin da kann ich´s ja auch etwas kürzer gestalten.

Dank dir @AndyB


ein Problem hab ich da noch, wenn mein setup bzw. exe fertig ist dauert das etwas bis die html seite geschlossen wird, kann man das beschleunigen ?

_________________
mfg
Tana´Ri