Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
Delphi 7 Enterprise
|
Re: Form nicht mehr bedienbar
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.
|