Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Problema Nel Minimizzare Applicazioni Windows
Forum - C# / VB.NET - Problema Nel Minimizzare Applicazioni Windows

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 23:05
Martedì, 16/10/2012
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....

Codice sorgente - presumibilmente C#

  1. [DllImport("user32.dll", CharSet = CharSet.Auto)]
  2.         static extern bool AppendMenu(IntPtr hMenu, MenuFlags uFlags, uint uIDNewItem, string lpNewItem);
  3.  
  4.         [Flags]
  5.         public enum MenuFlags : uint
  6.         {
  7.             MF_STRING = 0,
  8.             MF_BYPOSITION = 0x400,
  9.             MF_SEPARATOR = 0x800,
  10.             MF_REMOVE = 0x1000,
  11.         }
  12.  
  13.         private const int SW_SHOWNORMAL = 1;
  14.         private const int SW_SHOWMINIMIZED = 2;
  15.         private const int SW_SHOWMAXIMIZED = 3;
  16.         private const int SW_MINIMIZE = 6;
  17.         private const int SW_RESTORE = 9;
  18.  
  19.         //Carico la libreria per agire sulle finestre
  20.         [DllImport("user32.dll")]
  21.         static extern int ShowWindow(IntPtr hWnd, int nCmdShow);
  22.  
  23.         const int SW_MINIMIZED = 6;  //Costante con valore 6 ovvero Minimizza
  24.  
  25.          
  26.         //Delegato per l'enumerazione dei thread
  27.         delegate bool EnumThreadDelegate(IntPtr hWnd, IntPtr lParam);
  28.  
  29.         [DllImport("user32.dll")]
  30.         static extern bool EnumThreadWindows(int dwThreadId, EnumThreadDelegate lpfn, IntPtr lParam);
  31.        
  32.  
  33.        static IEnumerable<IntPtr> EnumerateProcessWindowHandles(int processID)
  34.         {
  35.             List<IntPtr> handles = new List<IntPtr>();
  36.  
  37.             EnumThreadDelegate addWindowHandle = delegate(IntPtr hWnd, IntPtr param)
  38.             {
  39.                 handles.Add(hWnd);
  40.                 return true;
  41.             };
  42.  
  43.             //Recupero tutti i processi ordinandoli e recuperando il valore dell'handle
  44.             foreach (ProcessThread thread in Process.GetProcessById(processID).Threads)
  45.                 EnumThreadWindows(thread.Id, addWindowHandle, IntPtr.Zero);
  46.  
  47.             return handles;
  48.         }
  49.  
  50.  
  51.  
  52.  
  53.  
  54.         //Al click del pulsante
  55.         //Qui succede lo scatafascio
  56.        
  57.           foreach (IntPtr handle in EnumerateProcessWindowHandles(Process.GetProcessesByName("explorer")[0].Id))
  58.                 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

http://msdn.microsoft.com/it-it/library/windows/desktop/ms ...

Ultima modifica effettuata da Thejuster il 16/10/2012 alle 23:08


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 0:35
Mercoledì, 17/10/2012
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.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 8:41
Mercoledì, 17/10/2012
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

http://msdn.microsoft.com/it-it/library/ya33w9f2%28v=vs.90 ...

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 il 17/10/2012 alle 9:00


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:04
Mercoledì, 17/10/2012
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

http://msdn.microsoft.com/en-us/library/windows/desktop/ms ...

Ultima modifica effettuata da nessuno il 17/10/2012 alle 11:04


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:28
Mercoledì, 17/10/2012
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.


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:05
Mercoledì, 17/10/2012
Questo esempio non è recentissimo ed è in C++ però dovrebbe esserti utile


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 20:28
Mercoledì, 17/10/2012
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.  http://go.microsoft.com/fwlink/?linkid=14202"'   ... Studio 2010\App Organizer\Desktop.cs    636    40    App Organizer



Soluzioni? :(


PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5473
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:40
Mercoledì, 17/10/2012
Ooops ... non ti ho dato il link dell'esempio C/C++

http://www.codeproject.com/Articles/21066/Multiple-Desktops



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:05
Giovedì, 18/10/2012
Allora ecco cosa ho fatto

Codice sorgente - presumibilmente C++

  1. [StructLayout(LayoutKind.Sequential)]
  2.         public struct SECURITY_ATTRIBUTES
  3.         {
  4.             public int nLength;
  5.             public IntPtr lpSecurityDescriptor;
  6.             public int bInheritHandle;
  7.         }
  8.  
  9.         [DllImport("kernel32.dll")]
  10.         static extern bool CreateDirectory(string lpPathName, SECURITY_ATTRIBUTES lpSecurityAttributes);
  11.  
  12.  
  13.  
  14. [DllImport("user32.dll", EntryPoint = "CreateDesktop", CharSet = CharSet.Unicode, SetLastError = true)]
  15.         public static extern IntPtr CreateDesktop(
  16.                         [MarshalAs(UnmanagedType.LPWStr)] string desktopName,
  17.                         [MarshalAs(UnmanagedType.LPWStr)] string device,
  18.                         [MarshalAs(UnmanagedType.LPWStr)] string deviceMode,
  19.                         [MarshalAs(UnmanagedType.U4)] int flags,
  20.                         [MarshalAs(UnmanagedType.U4)] ACCESS_MASK accessMask,
  21.                         [MarshalAs(UnmanagedType.LPStruct)] SECURITY_ATTRIBUTES attributes);
  22.  
  23.  
  24.  [DllImport("user32.dll", EntryPoint = "CloseDesktop", CharSet = CharSet.Unicode, SetLastError = true)]
  25.         [return: MarshalAs(UnmanagedType.Bool)]
  26.         public static extern bool CloseDesktop(IntPtr handle);
  27.  
  28.  
  29.   [Flags]
  30.         enum ACCESS_MASK : uint
  31.         {
  32.             DELETE = 0x00010000,
  33.             READ_CONTROL = 0x00020000,
  34.             WRITE_DAC = 0x00040000,
  35.             WRITE_OWNER = 0x00080000,
  36.             SYNCHRONIZE = 0x00100000,
  37.  
  38.             STANDARD_RIGHTS_REQUIRED = 0x000f0000,
  39.  
  40.             STANDARD_RIGHTS_READ = 0x00020000,
  41.             STANDARD_RIGHTS_WRITE = 0x00020000,
  42.             STANDARD_RIGHTS_EXECUTE = 0x00020000,
  43.  
  44.             STANDARD_RIGHTS_ALL = 0x001f0000,
  45.  
  46.             SPECIFIC_RIGHTS_ALL = 0x0000ffff,
  47.  
  48.             ACCESS_SYSTEM_SECURITY = 0x01000000,
  49.  
  50.             MAXIMUM_ALLOWED = 0x02000000,
  51.  
  52.             GENERIC_READ = 0x80000000,
  53.             GENERIC_WRITE = 0x40000000,
  54.             GENERIC_EXECUTE = 0x20000000,
  55.             GENERIC_ALL = 0x10000000,
  56.  
  57.             DESKTOP_READOBJECTS = 0x00000001,
  58.             DESKTOP_CREATEWINDOW = 0x00000002,
  59.             DESKTOP_CREATEMENU = 0x00000004,
  60.             DESKTOP_HOOKCONTROL = 0x00000008,
  61.             DESKTOP_JOURNALRECORD = 0x00000010,
  62.             DESKTOP_JOURNALPLAYBACK = 0x00000020,
  63.             DESKTOP_ENUMERATE = 0x00000040,
  64.             DESKTOP_WRITEOBJECTS = 0x00000080,
  65.             DESKTOP_SWITCHDESKTOP = 0x00000100,
  66.  
  67.             WINSTA_ENUMDESKTOPS = 0x00000001,
  68.             WINSTA_READATTRIBUTES = 0x00000002,
  69.             WINSTA_ACCESSCLIPBOARD = 0x00000004,
  70.             WINSTA_CREATEDESKTOP = 0x00000008,
  71.             WINSTA_WRITEATTRIBUTES = 0x00000010,
  72.             WINSTA_ACCESSGLOBALATOMS = 0x00000020,
  73.             WINSTA_EXITWINDOWS = 0x00000040,
  74.             WINSTA_ENUMERATE = 0x00000100,
  75.             WINSTA_READSCREEN = 0x00000200,
  76.  
  77.             WINSTA_ALL_ACCESS = 0x0000037f
  78.         }
  79.  
  80.  
  81.  
  82.         private void Form1_Load(object sender, EventArgs e)
  83.         {
  84.             SECURITY_ATTRIBUTES lpSecurityAttributes = new SECURITY_ATTRIBUTES();
  85.             DirectorySecurity security = new DirectorySecurity();
  86.             lpSecurityAttributes.nLength = Marshal.SizeOf(lpSecurityAttributes);
  87.             byte[] src = security.GetSecurityDescriptorBinaryForm();
  88.             IntPtr dest = Marshal.AllocHGlobal(src.Length);
  89.             Marshal.Copy(src, 0, dest, src.Length);
  90.             lpSecurityAttributes.lpSecurityDescriptor = dest;
  91.             string path = @"C:\Test";
  92.             CreateDirectory(path, lpSecurityAttributes);
  93.         }
  94.  
  95.  
  96.  
  97. private void button1_Click(object sender, EventArgs e)
  98.         {
  99.            IntPtr ins = CreateDesktop("prova", null, null, 0, ACCESS_MASK.GENERIC_ALL, null);
  100.         }




Ho un errore proprio durante la dichiarazione dell'api CreateDesktop

public static extern IntPtr CreateDesktop


Errore    1    Accessibilità incoerente: il tipo parametro 'Multiple_Desktop.Form1.ACCESS_MASK' è meno accessibile del metodo 'Multiple_Desktop.Form1.CreateDesktop(string, string, string, int, Multiple_Desktop.Form1.ACCESS_MASK, Multiple_Desktop.Form1.SECURITY_ATTRIBUTES)'    c:\users\melina\documents\visual studio 2010\Projects\Multiple Desktop\Multiple Desktop\Form1.cs    37    37    Multiple Desktop


Mannaggia l'albo dei ciaffi..

Qualche soluzione? :grr:

Ultima modifica effettuata da Thejuster il 18/10/2012 alle 10:10


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo