SetWindowPos

giovedì 11 settembre 2008 - 10.55

skomed Profilo | Newbie

ciao a tutti....

dovrei utilizzare questa api ma non ho ben capito come utilizzarla al mio scopo...

mi potete dare un piccolo chiarimento in modo da capire bene cosa rappresentano i vari parametri che gli devo passare?

considerate che la devo utilizzare in questo contesto :

keyboardProcess = new Process(); keyboardProcess.StartInfo.FileName = @"C:\windows\system32\osk.exe"; keyboardProcess.Start(); SetWindowPos(....)

quello che vorrei è che la finestra che genera quel processo ( tastiera di windows ) sia posizionata in 200,100 pixel e sia in secondo piano ( ma vorrei capire cosa dovrei fare se la volessi in primo piano)

vi ringrazio

Biagio

aiedail92 Profilo | Expert

Ciao

Questa è la firma della funzione, sono spiegati anche i parametri:

[DllImport("user32.dll")] private static extern bool SetWindowPos( IntPtr hWnd, //L'handle della finestra da spostare IntPtr hWndInsertAfter, //L'handle della finestra dietro cui spostarla int x, //La nuova posizione della finestra dal lato sinistro int y, //La nuova posizione della finestra dall'alto int cx, //La nuova larghezza della finestra int cy, //La nuova altezza della finestra uint uFlags //Specifica quali argomenti devono essere ritenuti validi //e le impostazioni di spostamento );

Qui sotto c'è un esempio di come puoi usare la funzione:

//Questi sono alcuni flag che servono per spostare la finestra private const int SWP_NOSIZE = 0x0001; private const int SWP_NOACTIVATE = 0x0010; public void test() { Process keyboardProcess = new Process(); keyboardProcess.StartInfo.FileName = @"C:\windows\system32\osk.exe"; keyboardProcess.Start(); //Attende un attimo che venga creata la finestra keyboardProcess.WaitForInputIdle(100); SetWindowPos( keyboardProcess.MainWindowHandle, //Sposta la finestra principale del processo this.Handle, //la mette dietro alla finestra corrente 200, //coordinate (200, 100) 100, 0, //le nuove dimensioni vengono tralasciate 0, //impostando il flag SWP_NOSIZE SWP_NOSIZE | SWP_NOACTIVATE //Ignora i parametri cx e cy e non attiva la finestra ); }

Per portarla in primo piano invece basta che rimuovi il flag SWP_NOACTIVATE e imposti il parametro hWndInsertAfter su (IntPtr)0, che è il valore di HWND_TOP

Luca

skomed Profilo | Newbie

esiste un lista di tutti i flag e il loro rispettivo significato?

In ogni caso grazie mille per le informazioni che gia mi hai dato... sei stato chiarissimo e utilissimo !

Biagio

aiedail92 Profilo | Expert

La lista dei flag la trovi sulla documentazione della funzione (vedi qui per la guida in linea: http://msdn.microsoft.com/en-us/library/ms633545.aspx)

Invece per sapere i valori di ogni singolo flag devi cercare negli header delle funzioni di Windows (in questo caso winbase.h) la definizione del flag. Quelle possibli per questa funzione sono (tratto da winbase.h):

/* * SetWindowPos Flags */ #define SWP_NOSIZE 0x0001 #define SWP_NOMOVE 0x0002 #define SWP_NOZORDER 0x0004 #define SWP_NOREDRAW 0x0008 #define SWP_NOACTIVATE 0x0010 #define SWP_FRAMECHANGED 0x0020 /* The frame changed: send WM_NCCALCSIZE */ #define SWP_SHOWWINDOW 0x0040 #define SWP_HIDEWINDOW 0x0080 #define SWP_NOCOPYBITS 0x0100 #define SWP_NOOWNERZORDER 0x0200 /* Don't do owner Z ordering */ #define SWP_NOSENDCHANGING 0x0400 /* Don't send WM_WINDOWPOSCHANGING */ #define SWP_DRAWFRAME SWP_FRAMECHANGED #define SWP_NOREPOSITION SWP_NOOWNERZORDER #if(WINVER >= 0x0400) #define SWP_DEFERERASE 0x2000 #define SWP_ASYNCWINDOWPOS 0x4000 #endif /* WINVER >= 0x0400 */

Luca

skomed Profilo | Newbie

ho un altro piccolo problema..

oltre a posizionarla nella posizione x,y vorrei anche togliere la barra del titolo e anche la barra con "file" ecc...

sto provando con le API SetWindowLong, getMenu ma non sono pratico e vorrei una mano...

grazie

aiedail92 Profilo | Expert

Ciao

Purtroppo la documentazione dichiara esplicitamente che gli stili non possono essere modificati dopo che la finestra è stata creata: "After the control has been created, these styles cannot be modified, except as noted."

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5