Newsgroup: it.comp.lang.delphi
Titolo: Passaggio da un programma all'altro

Ciao a tutti,
  dopo un lungo girovagare sui motori di ricerca rieccomi a voi tutti.
 
Il mio programma e' installato su un pc, in rete aziendale, dove all'avvio 
viene lanciato un file .RDP che apre una sessione RDP e un gestionale.
Dato che e' in RDP tutto il lavoro svolto dal gestionale sul pc e' salvato 
sul server; tuttavia qualche volta e' necessario passare alcuni dati al mio 
programma che, invece, gira in locale sul PC.
 
Problemi non ce ne sono, anzi tutto va a meraviglia, ma recentemente il 
collega che lavora sul quel pc mi ha chiesto se, una volta spostati i dati 
richiesti nel mio programma, si possa rientrare automaticamente ritornare al 
gestionale RDP.
In pratica quello che vuole evitare e' di premere ALT + TAB recuperare la 
finestra del programma e selezionarla o, evitare di premere il stato windows 
e selezionare l'altra finestra.
Per ragioni di bon ton non riporto la mia risposta, ma ho fatto mia questa 
(assurda) richiesta e ho trovato diversi link dove si puo' creare un elenco 
dei processi avviati o delle applicazioni in esecuzione.
Ecco il vero problema, trattandosi un file .RDP (e' un file di testo) che 
apre una connessione remota, non riesco ad identificare il nome del 
processo, pero' e' presente nella lista del task manager come programma in 
esecuzione.
 
Ecco alcuni link che ho visitato
 
http://www.delphipages.com/forum/showthread.php?t=35928
 
 
http://stackoverflow.com/questions/5951631/how-to-get-captions-of-actual-windows-currently-running
 
 
http://delphi.cjcsoft.net/viewthread.php?tid=49450
 
 
ma non riesco, una premuto un bottone dal mio programma (per prova) a 
passare in automatico al gestionale.
 
Qualche suggerimento in merito ???
 
Grazie per l'interesse
 
Ciao
 
Daniele 
 

 esecuzione.
 
Se lo vedi nella lista dei processi dovresti essere in grado di
ottenere l'handle della finestra principale usando FindWindow()
 
A quel punto per portarla in primo piano dovrebbe bastare usare
SetForeGroundWindow() o SetWindowPos().
 
Tu cosa hai provato a fare? Se posti del codice magari possiamo
dirti cosa c'e' che non va.
 
ciao
Giacomo

 dirti cosa c'e' che non va.
 
Ecco il codice per chi fosse interessato
 
procedure TMF.FrontWindowsClick(Sender: TObject);
var hd : hwnd;
    WS : WideString;
    WN : PWideChar;
begin
  ProgramList.Clear; // E' una TStringList inizializzato e distrutto nella 
create e close della form
  EnumWindows(@EnumWindowsProc, 0);
  if ProgramList.Count>0 then
  begin
     WS:=ProgramList.Strings[0];
     WN:=PwideChar(WS);
     hd := FindWindow(nil,WN);
     If  hd>0 Then SetForegroundWindow(hd);
  end;
end;
 
Questa funzione seguente poyrte trovarla qui con tutta la discussione
http://stackoverflow.com/questions/5951631/how-to-get-captions-of-actual-windows-currently-running
 
 
function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
  s: string;
  IsVisible, IsOwned, IsAppWindow: Boolean;
begin
  Result := True;//carry on enumerating
 
  IsVisible := IsWindowVisible(hwnd);
  if not IsVisible then
    exit;
 
  IsOwned := GetWindow(hwnd, GW_OWNER)<>0;
  if IsOwned then
    exit;
 
  IsAppWindow := GetWindowLongPtr(hwnd, GWL_STYLE) and WS_EX_APPWINDOW<>0;
  if not IsAppWindow then
    exit;
 
  SetLength(s, GetWindowTextLength(hwnd));
  GetWindowText(hwnd, PChar(s), Length(s)+1);
  ProgramList.Add(S)
end;
 
Pero' non so come si comporta se il programma nasconde la finestra nella 
taskbar.
 
Grazie per l'interesse !!
 
Ciao
 
Daniele 
 

 Qualche suggerimento in merito ???
 
L'applicazione del remote desktop si dovrebbe chiamare mstc.exe, afaik.
 
Puoi ciclare sulla lista dei processi cercando quello (esempi sotto 
https://www.google.it/search?q=delphi+list+active+processes
)
 
Saluti
Paolo Arosio