Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Febbraio 22, 2021, 01:09:26 pm

Titolo: Solo Windows: eseguibile in primo piano
Inserito da: bonmario - Febbraio 22, 2021, 01:09:26 pm
Ciao a tutti,
sapete dirmi se e come è possibile capire quale eseguibile ha un proprio form in primo piano?

Grazie, Mario
Titolo: Re:Solo Windows: eseguibile in primo piano
Inserito da: bonmario - Febbraio 22, 2021, 07:51:23 pm
Per il momento, ho trovato e sto provando questa, che sembra promettente:

Codice: [Seleziona]
function GetCurrentActiveProcessPath: String;
var pid     : DWORD;
    hProcess: THandle;
    path    : array[0..4095] of Char;
begin
    GetWindowThreadProcessId(GetForegroundWindow, pid);

    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pid);
    if hProcess <> 0 then
      try
        if GetModuleFileNameEx(hProcess, 0, @path[0], Length(path)) = 0 then
          RaiseLastOSError;

        result := path;
      finally
        CloseHandle(hProcess);
      end
    else
      RaiseLastOSError;
end;

Ciao, Mario
Titolo: Re:Solo Windows: eseguibile in primo piano
Inserito da: DragoRosso - Marzo 22, 2021, 09:43:03 pm
Si, anche io usavo questa tecnica, ma se hai applicazioni UWP o applicazioni con livello di amministratore attive, la funzione ti ritorna o l'ApplicationFrame.exe o un errore (Code 5 mi pare processo non accessibile ?).

Poi non ho approfondito, di fatto non la uso da diverso tempo.
Titolo: Re:Solo Windows: eseguibile in primo piano
Inserito da: bonmario - Marzo 23, 2021, 07:02:25 am
Poi non ho approfondito, di fatto non la uso da diverso tempo.

Intendi dire che usi altro, o che hai rinunciato?

Ciao, Mario
Titolo: Re:Solo Windows: eseguibile in primo piano
Inserito da: DragoRosso - Marzo 23, 2021, 09:28:28 am
Non la uso perchè non mi e più utile.
Diversi anni fà la usavo, insieme alle tecniche di "impersonificazione" degli account, per alcune funzioni di monitoraggio che i software che sviluppavo per alcuni clienti dovevano avere (appunto trace delle applicazioni in primo piano e loro "abbattimento").

Semplicemente se il mio software non era in primo piano, voleva dire che un operatore stava "giocando" e questo doveva essere riportato in un log e l'applicazione in primo piano terminata.

Per fare ciò usavo quella funzione, poi il software impersonava un account amministratore e "killava" l'eventuale processo, riprendendo poi la sua funzione a livello di privilegi utente.

Quando sono comparsi i primi problemi, e non potendo per ragioni di sicurezza rimanere costantemente in uso come "amministratore",  il cliente decise di togliere la funzione (tanto capitava talmente di rado che si trovasse una applicazione in primo piano che di fatto non era più necessaria).

Non ho poi approfondito il percorso per bypassare tuttto ciò. Di fatto è possibile tracciare senza account amministratore (o impersonare un amministratore), a parte il "kill", basta vedere l'utility Process Explorer di Mark Russinovich (SysInternals) che traccia tutto senza i privilegi di amministratore.

Un giorno mi dovrò mettere di impegno .....  :)
Titolo: Re:Solo Windows: eseguibile in primo piano
Inserito da: bonmario - Marzo 23, 2021, 09:50:00 am
Ah, ok, praticamente avevi il problema inverso al mio.

La mia situazione è questa:
lancio un programma che deve fare alcuni lavori che durano qualche minuto. Quindi l'utente lo lancia e passa a fare altro.
Quando il mio programma termina i controlli, deve segnalare all'utente l'esito, e quindi lo porto in primo piano.
Questo però succedeva magari proprio nel momento in cui l'utente aveva bisogno di vedere altre finestre, quindi iconizzava la mia e poi magari se ne dimenticava, o se ne ricordava ore dopo.
Ho quindi aggiunto un timer con cui ogni X minuti verifico se la finestra è o meno in primo piano e, se non lo è, la riporta in primo piano.

Ciao, Mario
Titolo: Re:Solo Windows: eseguibile in primo piano
Inserito da: DragoRosso - Marzo 23, 2021, 10:19:16 am
Scusami se intervengo nel modo, ma è solo per aprire nuovi orizzonti non per criticare.

Invece di portare in primo piano l'applicazione, che potrebbe effettivamente dare dei disagi notevoli all'utente perchè gli toglie il focus da ciò che stava facendo,
perchè non approcci altre soluzioni come un "fumetto" sulla taskbar o tramite il centro notifiche di Windows ?

Anche soluzioni multimediali banali, come l'emissione di una frase con la sintesi vocale integrata di Windows tramite gli altoparlanti potrebbe dare il suo effetto.

A disposizione per chiarimenti.
 
Titolo: Re:Solo Windows: eseguibile in primo piano
Inserito da: bonmario - Marzo 23, 2021, 10:57:09 am
Figurati, è sempre bello avere altri punti di vista, perché spesso ci si fossilizza su una soluzione e manco si pensa alle alternative !!!
In linea di massima la penso come te, ma in questo caso specifico, le segnalazioni di quel programma vanno esaminate il prima possibile.
Quindi, se l'utente è al telefono quando esce la prima volta l'esito, può iconizzare la finestra o altro, ma in ogni caso sa che deve fare questa cosa il prima possibile.
In passato avevo provato con le notifiche di Windows, ma quelle stanno fuori per qualche secondo, e poi spariscono. Se in quel momento l'utente è in bagno o comunque sta guardando altrove, sono fregato.
Col metodo attuale, io continuo a portargli la finestra in primo piano, e gli rompo le balle volutamente, così è obbligato a guardare i messaggi il prima possibile!

Ciao, Mario
Titolo: Re:Solo Windows: eseguibile in primo piano
Inserito da: DragoRosso - Marzo 23, 2021, 11:03:57 am
  ;)  ;D