Outils pour utilisateurs

Outils du site


lang:csharp:ihm:commun

Personnaliser un composant

Affiche un MessageBox sans bloquer la suite du process

Vive le thread tout simplement. Facilement adaptable à n'importe quelle autre action.

new Thread(new ThreadStart(delegate
{
  MessageBox.Show("Je ne bloque pas.", "Titre", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
)).Start();

Pour forcer la MessageBox à rester au dessus de l'application, il faut ajouter le paramètre MB_TOPMOST :

MessageBox.Show("Je ne bloque pas.", "Titre", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1, (MessageBoxOptions)0x40000);

messagebox on top of splashscreen Archive du 03/06/2014 le 26/04/2020

Barre de progression dans la barre des tâches

TaskbarProgress.java
using System;
using System.Runtime.InteropServices;
 
public static class TaskbarProgress
{
  public enum TaskbarStates
  {
    NoProgress = 0,
    Indeterminate = 0x1,
    Normal = 0x2,
    Error = 0x4,
    Paused = 0x8
  }
 
  [ComImport()]
  [Guid("ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf")]
  [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
  private interface ITaskbarList3
  {
    // ITaskbarList
    [PreserveSig]
    void HrInit();
    [PreserveSig]
    void AddTab(IntPtr hwnd);
    [PreserveSig]
    void DeleteTab(IntPtr hwnd);
    [PreserveSig]
    void ActivateTab(IntPtr hwnd);
    [PreserveSig]
    void SetActiveAlt(IntPtr hwnd);
 
    // ITaskbarList2
    [PreserveSig]
    void MarkFullscreenWindow(IntPtr hwnd, [MarshalAs(UnmanagedType.Bool)] bool fFullscreen);
 
    // ITaskbarList3
    [PreserveSig]
    void SetProgressValue(IntPtr hwnd, UInt64 ullCompleted, UInt64 ullTotal);
    [PreserveSig]
    void SetProgressState(IntPtr hwnd, TaskbarStates state);
  }
 
  [Guid("56FDF344-FD6D-11d0-958A-006097C9A090")]
  [ClassInterface(ClassInterfaceType.None)]
  [ComImport()]
  private class TaskbarInstance
  {
  }
 
  private static ITaskbarList3 taskbarInstance = (ITaskbarList3)new TaskbarInstance();
 
  public static void SetState(IntPtr windowHandle, TaskbarStates taskbarState)
  {
    taskbarInstance.SetProgressState(windowHandle, taskbarState);
  }
 
  public static void SetValue(IntPtr windowHandle, double progressValue, double progressMax)
  {
    taskbarInstance.SetProgressValue(windowHandle, (ulong)progressValue, (ulong)progressMax);
  }
}

et son utilisation

private static bool taskbarSupported = Environment.OSVersion.Version >= new Version(6, 1);
 
if (taskbarSupported)
{
  // Utilisation
  TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.Normal);
  TaskbarProgress.SetValue(Handle, toolStripProgressBar1.Value, toolStripProgressBar1.Maximum);
 
  // Désactivation
  TaskbarProgress.SetState(this.Handle, TaskbarProgress.TaskbarStates.NoProgress);
}

Windows 7 progress bar in taskbar in C#? Archive du 18/08/2009 le 26/04/2020

Il n'est pas possible d'utiliser taskbarSupported depuis la classe TaskbarProgress (comme l'exemple de StackOverFlow le fait).

Si un élément de cette classe est exécuté, le constructeur privé l'est aussi à cause de la variable static, ce qui entraîne une exception de type TypeInitializationException sous Windows XP et sous Windows Vista.

lang/csharp/ihm/commun.txt · Dernière modification : 2020/04/26 23:27 de root