Windows 11 + DragAcceptFiles(Handle, True); in OnCreate

di il
5 risposte

Windows 11 + DragAcceptFiles(Handle, True); in OnCreate

Ciao a tutti,

su alcuni sistemi Windows 11, una mia Windows VCL App (v.2.0) si avvia correttamente mentre su altri essa rimane elencata in “Gestione Attività” di Windows come processo background. Nel visualizzatore eventi di Windows non si trova traccia di alcun errore, quindi da l'impressione come se l'app fosse bloccata prima dell'evento OnShow.

Ora, sugli stessi OS Win11 dove si manifesta il malfunzinamento della v.2.0, la v.1.3 si apre correttamente. L'unica sostanziale differenza tra queste versioni è che all'evento OnCreate è stata aggiunta la funzione DragAcceptFiles(Handle, True); per abilitare il drag&drop.

Quindi avrei le seguenti domande:

  1. È possibile spostare DragAcceptFiles(Handle, True); da OnCreate in OnShow senza compromettere il buon funzionamento?
  2. Qualcuno ha fatto un'esperienza analoga e sa se per Windows 11 esiste un metodo alternativo a DragAcceptFiles(Handle, True); per abilitare i drag&drop?

 Mille grazie, Ale

5 Risposte

  • Re: Windows 11 + DragAcceptFiles(Handle, True); in OnCreate

    10/05/2024 - al.delphi ha scritto:


    Ora, sugli stessi OS Win11 dove si manifesta il malfunzinamento della v.2.0, la v.1.3 si apre correttamente. L'unica sostanziale differenza tra queste versioni è che all'evento OnCreate è stata aggiunta la funzione DragAcceptFiles(Handle, True); per abilitare il drag&drop.

    Siamo sicuri che la problematica sia realmente legata a quella API?

    Hai fatto una prova con un progetto vuoto che abbia solo quella funzionalità e testato che, al netto di tutto il resto, quello funziona su altre versioni di Windows ma non sulla 11?

    Il tutto senza includere elementi esterni di contorno…

    Pongo queste domande perché stando alla documentazione ufficiale non sembrano esserci particolari annotazioni su questa funzione API.

  • Re: Windows 11 + DragAcceptFiles(Handle, True); in OnCreate

    Ciao Alka,

    grazie per l'informazione. Ricompilo l'app 2.0 senza DragAcceptFiles(Handle, True); e la farò testare su una delle macchine dove l'app rimane bloccata all'avvio.

    Nel caso dovesse avviarsi l'interfaccia, mi puoi rispondere alla domanda #1, ovvero se posso spostare DragAcceptFiles(Handle, True); in OnShow senza compromettere il funzionamento? Fin'ora lo utilizzavo esclusivamente in OnCreate.

    Grazie mille, Ale

  • Re: Windows 11 + DragAcceptFiles(Handle, True); in OnCreate

    10/05/2024 - al.delphi ha scritto:


    Nel caso dovesse avviarsi l'interfaccia, mi puoi rispondere alla domanda #1, ovvero se posso spostare DragAcceptFiles(Handle, True); in OnShow senza compromettere il funzionamento? Fin'ora lo utilizzavo esclusivamente in OnCreate.

    Non credo sia corretto spostarlo in OnShow: quell'evento si verifica ogni volta che la finestra viene mostrata, ma anche quando viene nascosta e poi mostrata di nuovo, mentre la caratteristica di poter accettare file deve essere una operazione “una tantum”.

    Può essere però che ci siano state delle modifiche a livello di gestione dell'handle di Windows, in quanto mi pare di ricordare che la creazione dei controlli visuali basati su API di Windows (e il Form è uno di questi), ossia che hanno appunto un handle, avviene in due fasi: una questione è creare l'oggetto in sé, che è una questione che riguarda Delphi, l'altro è la creazione effettiva dell'handle che rappresenta il controllo in Delphi (per ricevere messaggi, avere una rappresentazione, ecc.).

    Fossi in te, proverei a fare l'override dei metodi CreateWnd() e DestroyWnd() che sono quelli invocati quando si va a creare e distruggere l'handle del controllo.

    Idealmente, dovresti scrivere qualcosa del genere:

    procedure TMainForm.CreateWnd;
    begin 
      inherited;
      DragAcceptFiles(Handle, True);  
    end;
    
    procedure TMainForm.DestroyWnd;
    begin 
      DragAcceptFiles(Handle, False);
      inherited;
    end;

    Magari questo risolve il problema alla radice.

    Nel costruttore effettivamente potrebbe non essere corretto, perché se qualche condizione ricrea l'handle, il drag&drop rimane “registrato” su quello precedente che non è più valido.

  • Re: Windows 11 + DragAcceptFiles(Handle, True); in OnCreate

    Confermo che DragAcceptFiles(Handle, True); in OnCreate non era la causa della mancata apertura dell'app ma un repeat loop in OnShow. Non l'avevo preso in considerazione perché c'era anche nella vecchia versione la quale, stando alle parole dell'utente, funzionava correttamente sulla stessa macchina Windows 11. Ho tolto il loop da OnShow per garantire la visualizzazione del form e infatti ora va.

    Mille grazie, Alka, della spiegazione riguardo DragAcceptFiles(Handle, True); da utilizzare esclusivamente in OnCreate e del sostegno morale. : )

    Ale

  • Re: Windows 11 + DragAcceptFiles(Handle, True); in OnCreate

    11/05/2024 - al.delphi ha scritto:


    Mille grazie, Alka, della spiegazione riguardo DragAcceptFiles(Handle, True); da utilizzare esclusivamente in OnCreate e del sostegno morale. : )

    Hai risolto un problema, ma potresti averne potenzialmente altri: anche OnCreate - come spiegato sopra - è un “posto sbagliato”.

    Se l'handle della finestra viene ricreato per qualsivoglia motivo, e non si tratta di un evento raro, non accetterà più file con drag&drop.

Devi accedere o registrarti per scrivere nel forum
5 risposte