Oppure

Loading
16/10/12 21:05
Thejuster
Sempre in merito ad un mio progettino ho un piccolo problema.
Quando provo a minimizzare un processo mi si scombina l'intero desktop.

non sò a cosa è dovuto questo problema ma vi posto il codice.

forse riuscite a capire il problema dove sta....


  [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern bool AppendMenu(IntPtr hMenu, MenuFlags uFlags, uint uIDNewItem, string lpNewItem);

        [Flags]
        public enum MenuFlags : uint
        {
            MF_STRING = 0,
            MF_BYPOSITION = 0x400,
            MF_SEPARATOR = 0x800,
            MF_REMOVE = 0x1000,
        }

        private const int SW_SHOWNORMAL = 1;
        private const int SW_SHOWMINIMIZED = 2;
        private const int SW_SHOWMAXIMIZED = 3;
        private const int SW_MINIMIZE = 6;
        private const int SW_RESTORE = 9;

        //Carico la libreria per agire sulle finestre
        [DllImport("user32.dll")]
        static extern int ShowWindow(IntPtr hWnd, int nCmdShow);

        const int SW_MINIMIZED = 6;  //Costante con valore 6 ovvero Minimizza

         
        //Delegato per l'enumerazione dei thread
        delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);

        [DllImport("user32.dll")]
        static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);
       

       static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processID)
        {
            List<IntPtr> handles = new List<IntPtr>();

            EnumThreadDelegate addWindowHandle = delegate(IntPtr hWnd, IntPtr param)
            {
                handles.Add(hWnd);
                return true;
            };

            //Recupero tutti i processi ordinandoli e recuperando il valore dell'handle
            foreach (ProcessThread thread in Process.GetProcessById(processID).Threads)
                EnumThreadWindows(thread.Id, addWindowHandle, IntPtr.Zero);

            return handles;
        }
 




        //Al click del pulsante
        //Qui succede lo scatafascio
        
          foreach (IntPtr handle in EnumerateProcessWindowHandles(Process.GetProcessesByName("explorer")[0].Id))
                ShowWindow(handle, SW_MINIMIZED);




Se non volete riavviare il computer vi consiglio di non provare questo codice.. :pat:
In pratica mostrebbe tutti i processi in delle finestrelle rettangolari
permettendo così di vedere ogni processo o funzione di windows sul desktop.
tanto da poter spostare anche la finestre dello Start di Windows.


Lo scopo del codice era quello di minimizzare tutte le finestre e applicazioni aperte.
ma e successo l'opposto..

eppure qui credo che microsoft si esprime benissimo

msdn.microsoft.com/it-it/library/windows/desktop/…
Ultima modifica effettuata da Thejuster 16/10/12 21:08
mire.forumfree.it/ - Mire Engine
C# UI Designer
16/10/12 22:35
Con quel codice (che funziona regolarmente) minimizzi tutte le finestre collegate al processo "explorer" (e sono tante, anche normalmente non visibili).

Tra le varie window trattate nella foreach devi scegliere quelle che ti interessa minimizzare.

Ma così non ci saranno le varie applicazioni aperte (considera ad esempio, un browser) ...

P.S. Per provare il tuo codice e rimettere a posto tutto basta avviare il Task Manager e killare il processo explorer. Poi, sempre da Task Manager, basta avviare un nuovo processo explorer.
17/10/12 6:41
Thejuster
ah..

Bhe, in realtà mi servirebbe il metodo per minimizzare tutte le finestre aperte.
e poi poterle gestire tramite il TraySystem.

In pratica sto sviluppando un programmino, come se facesse da secondo desktop.
tipo come in ubuntu. cambiando desktop ti ritrovi altre finestre aperte o nessuna.

devo cercare anche il modo di creare un ContextMenu da assegnare sempre ad ogni applicazione aperta.
Non sarà facile come cosa. Ma tentare non nuoce.

Ho provato a cercare l'api CreateMenu. Ma di documentazione e proprio zero.
msdn non mi sà dire nulla al riguardo.

però guardando qui questo esempio

msdn.microsoft.com/it-it/library/…

forse dovrei Prima utilizzare l'api CreateMenu. e poi CreatePopup proprio come nell'esempio mostrato qui.

Ma il dubbio mi sorge qui.
Come aggiungo un nuovo menu ad un'altra applicazione?

Non credo che il SetMenu funzioni...
Il recupero degli Handles mi serviva anche a questo. così da passare hwnd alle api in modo da alterare le altre applicazioni.

Che poi ammesso che funzionasse. Dove me lo và ad inserire questo menu?

credo che questa semplice funzione non è il massimo. si dovrebbero enumerare anche i menu dell'applicazione che voglio alterare o sbaglio?
Ultima modifica effettuata da Thejuster 17/10/12 7:00
mire.forumfree.it/ - Mire Engine
C# UI Designer
17/10/12 9:04
Ti consiglio di lasciare perdere questo tipo di approccio ...

Per i desktop multipli Windows ha una gestione apposita (con API specifiche).

Ti consiglio di cominciare a studiare da

msdn.microsoft.com/en-us/library/windows/desktop/…(v=vs.85).aspx
Ultima modifica effettuata da 17/10/12 9:04
17/10/12 14:28
Thejuster
ah.. non sapevo che si poteva fare direttamente sul desktop.

ma c'è qualche esempio già fatto non so.. un qualche snippet pratico giusto per mostare il corretto funzionamento di quelle funzioni.

Non mi interessa avere tutto già pronto ma almeno sapere quella determinata funzione a cosa servi e come và applicata.

di solito su msdn viene solo illustrato il metodo di richiamo ma non di come applicare quella funzione in simbiosi con le altre.
mire.forumfree.it/ - Mire Engine
C# UI Designer
17/10/12 15:05
Questo esempio non è recentissimo ed è in C++ però dovrebbe esserti utile
17/10/12 18:28
Thejuster
Dunque ho provato un bel po di sistemi.

Ma riscontro un errore in una funzione

Una chiamata alla funzione PInvoke 'App Organizer! Desktop::OpenDesktop' ha sbilanciato lo stack. Questo problema può verificarsi quando la firma PInvoke gestita non corrisponde alla firma di destinazione non gestita. Verificare che la convenzione di chiamata e i parametri della firma PInvoke corrispondano alla firma di destinazione non gestita.


Warning    1    'System.AppDomain.GetCurrentThreadId()' is obsolete: '"AppDomain.GetCurrentThreadId has been deprecated because it does not provide a stable Id when managed threads are running on fibers (aka lightweight threads). To get a stable identifier for a managed thread, use the ManagedThreadId property on Thread. go.microsoft.com/fwlink/;'    H:\Visual Studio 2010\App Organizer\Desktop.cs    636    40    App Organizer



Soluzioni? :(
mire.forumfree.it/ - Mire Engine
C# UI Designer
17/10/12 18:40
Ooops ... non ti ho dato il link dell'esempio C/C++

codeproject.com/Articles/21066/…