Einzelnen Beitrag anzeigen

bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Form nicht mehr bedienbar

  Alt 16. Feb 2006, 15:32
keiner eine Idee ?
Hier mal der Code:
Zum starten vom Hauptmenü über einen Button (als Image mit OnmouseDown,Up,Click) zeige ich meine Form (navigation_frm) als kleine Leiste am oberen Bildschirmrand und startete gleichzeitig das ext Prog.
Hier kam es schon dazu, das meine form gar nicht zu Ende gezeichnet wurde, als das ext Prog startete.
Deshalb einen Delay-Timer von 3 sek.
Delphi-Quellcode:
procedure TMain_frm.Image5Click(Sender: TObject);
begin
   extApps_frm.timer1.Interval:=3000;
   extApps_frm.timer1.Enabled:=true;
   Main_frm.Hide;
   mediaplayer_frm.Hide;
   navigation_frm.FormStyle := fsStayOnTop;
   navigation_frm.Show;
   //SetForegroundWindow(navigation_frm.Handle);
end;
Delphi-Quellcode:
procedure TextApps_frm.Timer1Timer(Sender: TObject);
var app: String;
    appWithPfad : String;
begin
  begin
   app := ExtractFileName(config_frm.navigation_root_edit_Fld.Text);
   appWithPfad := config_frm.navigation_root_edit_Fld.Text;
   Wnd := FindWindow(PChar(app), nil);
   if IsEXERunning(app, False) then
    begin
      timer1.Enabled:=false;
      SetWindowPos(Wnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
     //ShowMessage('Läuft schon...)
    end
  else
    begin
     timer1.Enabled:=false;
     extApps_frm.RunApp(appWithPfad,0,40,800,530);
     //ShowMessage('Läuft nicht...);
    end;
 end;
end;
Diese procedure ist übernommen, da ich in API noch gar keine Kentnisse habe, auch überall in meinem Code mal Testversuche.
Delphi-Quellcode:
procedure TextApps_frm.RunApp(const FileName: String; Left, Top, Width, Height: Integer);

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  begin
    TList(lParam).Add(Pointer(hWnd));
    Result := True;
  end;

  function GetWndHandle(ProcessId: DWORD): HWND;
  var
    List: TList;
    I: Integer;
    PID: DWORD;
  begin
    Result := 0;
    List := TList.Create;
    try
      EnumWindows(@EnumWindowsProc, LPARAM(List));
      for I := 0 to List.Count - 1 do
        if GetWindowThreadProcessId(HWND(List.Items[I]), @PID) <> 0 then
          if PID = ProcessId then
          begin
            Result := HWND(List.Items[I]);
            Break;
          end;
    finally
      List.Free;
    end;
  end;

var
  SI: TStartupInfo;
  PI: TProcessInformation;

begin
  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb := SizeOf(TStartupInfo);
  if CreateProcess(nil, PChar(FileName), nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, INFINITE);
    AppHWnd := GetWndHandle(PI.dwProcessId);
    if IsWindow(AppHWnd) then
     if IsWindowVisible(AppHWnd) then
      begin
      Application.ProcessMessages;
      //ShowWindow(AppHWnd,SW_SHOWMINNOACTIVE);
      MoveWindow(AppHWnd, Left, Top, Width, Height, True);
      //windows.SetParent(AppHWnd,main_frm.Handle);
      //SetWindowPos(AppHWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
      SetWindowPos(AppHWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE or SWP_NOACTIVATE);
      //SendMessage(AppHWnd, WM_SYSCOMMAND, SC_Minimize, 0);
      CloseHandle(PI.hProcess);
      CloseHandle(PI.hThread);
     end;
   end;
end;
Wie gesagt, mit Notepad funktioniert es wunderbar, nur mit dem Navigator Notebook nicht, wenn es startet, dann öffnet sich dabei erst ein kleines Fenster mit Infos, danach erst das maximierte Programmfenster selbst. Irgendwie bekomme ich auch das Handle von diesem Prog nicht in den Griff. Abgesehen davon ist mein Hauptproblem, das ich meine Form (Leiste) oben sehe, und ich auch den Focus vom Navigon wegbekomme, aber irgendwie meine Buttons nicht betätigen kann solange das ext.Prog läuft.Ich denke das nicht zu ende zeichnen der Leiste,wenn ich den Timer weglasse, muss auch damit zusammenhängen.


  Mit Zitat antworten Zitat