Introduction
This source
project will demonstrate the implementation of hot keys, enumerable
collections, enums, binary serialization, DllImports of Win32 API, Window
Enumeration, CallBacks/Delegates, Custom Events and Event Handlers,
and more. It's
quite a bit of code to look through but some of you may find it interesting.
Most of the heavy lifting in this project is in the Window and Windows
classes that enumerate and manipulate the windows you choose:
using System;
using System.Text;
using System.Collections;
using System.Runtime.InteropServices;
namespace WindowHider
{
public class Window
{
[DllImport("user32.dll")] private static extern
bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
[DllImport("user32.dll")] private static extern
bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")] private static extern
bool IsIconic(IntPtr hWnd);
[DllImport("user32.dll")] private static extern
bool IsZoomed(IntPtr hWnd);
[DllImport("user32.dll")] private static extern
IntPtr GetForegroundWindow();
[DllImport("user32.dll")] private static extern
IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("user32.dll")] private static extern
IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach);
private const int SW_HIDE = 0;
private const int SW_SHOWNORMAL = 1;
private const int SW_SHOWMINIMIZED = 2;
private const int SW_SHOWMAXIMIZED = 3;
private const int SW_SHOWNOACTIVATE = 4;
private const int SW_RESTORE = 9;
private const int SW_SHOWDEFAULT = 10;
private IntPtr m_hWnd;
private string m_Title;
private bool m_Visible = true;
private string m_Process;
private bool m_WasMax = false;
public IntPtr hWnd
{
get{return m_hWnd;}
}
public string Title
{
get{return m_Title;}
}
public string Process
{
get{return m_Process;}
}
public bool Visible
{
get{return m_Visible;}
set
{
if(value == true)
{
if(m_WasMax)
{
if(ShowWindowAsync(m_hWnd,SW_SHOWMAXIMIZED))
m_Visible = true;
}
else
{
if(ShowWindowAsync(m_hWnd,SW_SHOWNORMAL))
m_Visible = true;
}
}
if(value == false)
{
m_WasMax = IsZoomed(m_hWnd);
if(ShowWindowAsync(m_hWnd,SW_HIDE))
m_Visible = false;
}
}
}
public Window(string Title, IntPtr hWnd, string Process)
{
m_Title = Title;
m_hWnd = hWnd;
m_Process = Process;
}
public override string ToString()
{
if (m_Title.Length > 0)
{
return m_Title;
}
else
{
return m_Process;
}
}
public void Activate()
{
if(m_hWnd == GetForegroundWindow())
return;
IntPtr ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow(),
IntPtr.Zero);
IntPtr ThreadID2 = GetWindowThreadProcessId(m_hWnd,IntPtr.Zero);
if (ThreadID1 != ThreadID2)
{
AttachThreadInput(ThreadID1,ThreadID2,1);
SetForegroundWindow(m_hWnd);
AttachThreadInput(ThreadID1,ThreadID2,0);
}
else
{
SetForegroundWindow(m_hWnd);
}
if (IsIconic(m_hWnd))
{
ShowWindowAsync(m_hWnd,SW_RESTORE);
}
else
{
ShowWindowAsync(m_hWnd,SW_SHOWNORMAL);
}
}
}
public class Windows : IEnumerable, IEnumerator
{
[DllImport("user32.dll")] private static extern
int GetWindowText(int hWnd, StringBuilder title, int size);
[DllImport("user32.dll")] private static extern
int GetWindowModuleFileName(int hWnd, StringBuilder title, int size);
[DllImport("user32.dll")] private static extern
int EnumWindows(EnumWindowsProc ewp, int lParam);
[DllImport("user32.dll")] private static extern
bool IsWindowVisible(int hWnd);
public delegate bool EnumWindowsProc(int hWnd, int lParam);
private int m_Position = -1;
ArrayList wndArray = new ArrayList();
private bool m_invisible = false;
private bool m_notitle = false;
public Windows(bool Invisible, bool Untitled)
{
m_invisible = Invisible;
m_notitle = Untitled;
EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
EnumWindows(ewp, 0);
}
public Windows()
{
EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
EnumWindows(ewp, 0);
}
private bool EvalWindow(int hWnd, int lParam)
{
if (m_invisible == false && !IsWindowVisible(hWnd))
return(true);
StringBuilder title = new StringBuilder(256);
StringBuilder module = new StringBuilder(256);
GetWindowModuleFileName(hWnd, module, 256);
GetWindowText(hWnd, title, 256);
if (m_notitle == false && title.Length == 0)
return(true);
wndArray.Add(new Window(title.ToString(), (IntPtr)hWnd,
module.ToString()));
return(true);
}
public IEnumerator GetEnumerator()
{
return (IEnumerator)this;
}
public bool MoveNext()
{
m_Position++;
if (m_Position < wndArray.Count)
{
return true;
}
else
{
return false;
}
}
public void Reset()
{
m_Position = -1;
}
public object Current
{
get
{
return wndArray[m_Position];
}
}
}
}