2010-05-27 2 views

Antwort

16

Mit den answer that @Zack posted und another one to find the handle of a console app kam ich auf diese und es funktioniert super.

class Program 
{ 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool FlashWindowEx(ref FLASHWINFO pwfi); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct FLASHWINFO 
    { 
     public UInt32 cbSize; 
     public IntPtr hwnd; 
     public UInt32 dwFlags; 
     public UInt32 uCount; 
     public Int32 dwTimeout; 
    } 

    public const UInt32 FLASHW_ALL = 3; 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Flashing NOW"); 
     FlashWindow(Process.GetCurrentProcess().MainWindowHandle); 
     Console.WriteLine("Press any key to continue"); 
     Console.ReadKey(); 
    } 

    private static void FlashWindow(IntPtr hWnd) 
    { 
     FLASHWINFO fInfo = new FLASHWINFO(); 

     fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo)); 
     fInfo.hwnd = hWnd; 
     fInfo.dwFlags = FLASHW_ALL; 
     fInfo.uCount = UInt32.MaxValue; 
     fInfo.dwTimeout = 0; 

     FlashWindowEx(ref fInfo); 
    } 
} 
+0

lol, ich denke, das ist einfacher als PInvoking, um den Griff zu bekommen – Davy8

+0

Sieht aus wie 3 verschiedene Möglichkeiten, den Fenstergriff zu bekommen, aber ich mag deine besten, da es nicht ' tPInvozieren, es so zu tun, es zu akzeptieren. – Davy8

+0

Wow. Ich habe die P/Invoke-Methode verwendet, um den Fenster-Handle des Konsolenfensters abzurufen, lol. http://msdn.microsoft.com/en-us/library/ms683175(VS.85).aspx – Zack

2

die Antwort in der Frage Kombination @ Zacks Kommentar verknüpft in und getting the hwnd of a console window using this konnte ich es zum Laufen bringen. Dies ist die Klasse I erstellt:

public static class FlashWindow 
{ 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool FlashWindowEx(ref FLASHWINFO pwfi); 
    [DllImport("kernel32.dll")] 
    static extern IntPtr GetConsoleWindow(); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct FLASHWINFO 
    { 
     public UInt32 cbSize; 
     public IntPtr hwnd; 
     public UInt32 dwFlags; 
     public UInt32 uCount; 
     public UInt32 dwTimeout; 
    } 

    public const UInt32 FLASHW_ALL = 3; 

    public static void Flash() 
    { 
     FLASHWINFO fInfo = new FLASHWINFO(); 

     fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo)); 
     fInfo.hwnd = GetConsoleWindow(); 
     fInfo.dwFlags = FLASHW_ALL; 
     fInfo.uCount = UInt32.MaxValue; 
     fInfo.dwTimeout = 0; 

     FlashWindowEx(ref fInfo); 
    } 
} 

Es ist immer blinkt nicht aufhören, bis es geschlossen ist, aber das war für meine Zwecke nicht wichtig.

4

Ich lese, dass es wasn't possible to get the window handle of a console window durch irgendwelche direkte Mittel, aber es scheint in .NET tatsächlich ziemlich einfach zu sein. Also, es ist so ziemlich das gleiche wie this question:

class Program 
{ 
    [DllImport("user32.dll")] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool FlashWindowEx(ref FLASHWINFO pwfi); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct FLASHWINFO 
    { 
     public UInt32 cbSize; 
     public IntPtr hwnd; 
     public UInt32 dwFlags; 
     public UInt32 uCount; 
     public UInt32 dwTimeout; 
    } 

    public const UInt32 FLASHW_STOP = 0; 
    public const UInt32 FLASHW_CAPTION = 1; 
    public const UInt32 FLASHW_TRAY = 2; 
    public const UInt32 FLASHW_ALL = 3; 
    public const UInt32 FLASHW_TIMER = 4; 
    public const UInt32 FLASHW_TIMERNOFG = 12; 

    static void Main(string[] args) 
    { 
     // Give you a few seconds to alt-tab away :) 
     Thread.Sleep(2000); 

     // Flash on the task bar, until the window becomes the foreground window. 
     // Constants for other behaviors are defined above. 
     FLASHWINFO fInfo = new FLASHWINFO(); 
     fInfo.cbSize = Convert.ToUInt32(Marshal.SizeOf(fInfo)); 
     fInfo.hwnd = Process.GetCurrentProcess().MainWindowHandle; 
     fInfo.dwFlags = FLASHW_TRAY | FLASHW_TIMERNOFG; 
     fInfo.uCount = UInt32.MaxValue; 
     fInfo.dwTimeout = 0; 
     FlashWindowEx(ref fInfo); 

     // Wait for input so the app doesn't finish right away. 
     Console.ReadLine(); 
    } 
} 
Verwandte Themen