4 votes

"épingler au bureau" dans Win 7, compatible XP

Comment puis-je obtenir l'effet "épingler au bureau" (c'est-à-dire m'immuniser contre la commande "Afficher le bureau") dans Win 7, en utilisant l'approche FindWindow + SetParent, ou toute autre approche qui fonctionnerait également dans XP ? Je sais que je pourrais créer un gadget, mais j'aimerais avoir une rétrocompatibilité avec XP, où j'ai ce code qui fonctionne bien :

IntPtr hWnd = FindWindow(null, "Untitled - Notepad");
IntPtr hDesktop = FindWindow("ProgMan", "Program Manager");
SetParent(hWnd, hDesktop);

2voto

Andres Points 103

dans mon application WPF, j'ai pu le résoudre en utilisant un timer, cela fonctionne à la fois sous XP et Win 7.

public MainWindow()
{
    InitializeComponent();

    // have some timer to fire in every 1 second
    DispatcherTimer detectShowDesktopTimer = new DispatcherTimer();
    detectShowDesktopTimer.Tick += new EventHandler(detectShowDesktopTimer_Tick);
    detectShowDesktopTimer.Interval = new TimeSpan(0, 0, 1);
    detectShowDesktopTimer.Start();
}

#region support immunizing against "Show Desktop"
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

private string GetWindowText(IntPtr handle)
{
    int chars = 256;
    StringBuilder buff = new StringBuilder(chars);
    if (GetWindowText(handle, buff, chars) > 0)
        return buff.ToString();
    else
        return string.Empty;
}
#endregion

private void detectShowDesktopTimer_Tick(object sender, EventArgs e)
{
    IntPtr fore = GetForegroundWindow();
    if (string.IsNullOrWhiteSpace(GetWindowText(fore)))
        ShowDesktopDetected();
}

private void ShowDesktopDetected()
{
    WindowInteropHelper wndHelper = new WindowInteropHelper(this);
    SetForegroundWindow(wndHelper.Handle);
}

2voto

Romaric FARENC Points 21

En travaillant sur un calendrier "collé au bureau", j'ai rencontré le même problème. Voici ma solution :

/************ win32 interop stuff ****************/

[DllImport( "user32.dll", SetLastError = true )]
static extern int SetWindowLong( IntPtr hWnd, int nIndex, IntPtr dwNewLong );

[DllImport( "user32.dll", SetLastError = true )]
static extern IntPtr FindWindow( string lpWindowClass, string lpWindowName );

[DllImport( "user32.dll", SetLastError = true )]
static extern IntPtr FindWindowEx( IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle );

const int GWL_HWNDPARENT = -8;

/************* in Form_Load or equivalent ***************/

IntPtr hprog = FindWindowEx(
    FindWindowEx(
        FindWindow( "Progman", "Program Manager" ),
        IntPtr.Zero, "SHELLDLL_DefView", ""
    ),
    IntPtr.Zero, "SysListView32", "FolderView"
);

SetWindowLong( this.Handle, GWL_HWNDPARENT, hprog );

La partie délicate était de définir le propriétaire du formulaire (SetWindowLong + GWL_HWNDPARENT) au lieu du parent du formulaire (SetParent). Cela a corrigé le formulaire qui n'était pas rendu sur un bureau aero.

0voto

Colin Pickard Points 23922

Les réponses à cette question devraient vous aider :

Sinon, vous pourriez l'implémenter comme une application de bureau active dans XP. Ou, s'il s'agit d'une simple application d'affichage, vous pourriez dessiner sur le papier peint du bureau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X