Aug 23, 2010

Switch Foreground window event capture [success in C#]

Here is the source code:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Text;

namespace ExampleApp
{
class ExampleForm : Form
{
delegate void WinEventDelegate(IntPtr hWinEventHook,
uint eventType, IntPtr hwnd, int idObject,
int idChild, uint dwEventThread, uint dwmsEventTime);

const uint WINEVENT_OUTOFCONTEXT = 0;
const uint EVENT_SYSTEM_FOREGROUND = 3;

[DllImport("user32.dll")]
static extern bool UnhookWinEvent(IntPtr hWinEventHook);
[DllImport("user32.dll")]
static extern IntPtr SetWinEventHook(uint eventMin,
uint eventMax, IntPtr hmodWinEventProc,
WinEventDelegate lpfnWinEventProc, uint idProcess,
uint idThread, uint dwFlags);
[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd,
StringBuilder lpString, int nMaxCount);

[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new ExampleForm());
}

ListBox m_list;
IntPtr m_hhook;

public ExampleForm()
{
m_list = new ListBox();
m_list.IntegralHeight = false;
m_list.Dock = DockStyle.Fill;
Controls.Add(m_list);

Text = "SetWinEventHook Example";

Load += new EventHandler(Program_Load);
FormClosing +=
new FormClosingEventHandler(Program_FormClosing);
}

void Program_Load(object sender, EventArgs e)
{
m_hhook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND,
EVENT_SYSTEM_FOREGROUND, IntPtr.Zero,
WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT);
}

void WinEventProc(IntPtr hWinEventHook, uint eventType,
IntPtr hwnd, int idObject, int idChild,
uint dwEventThread, uint dwmsEventTime)
{
if (eventType == EVENT_SYSTEM_FOREGROUND)
{
StringBuilder sb = new StringBuilder(500);
GetWindowText(hwnd, sb, sb.Capacity);

m_list.Items.Insert(0,
"Switched to: " + sb.ToString());
}
}

void Program_FormClosing(
object sender, FormClosingEventArgs e)
{
UnhookWinEvent(m_hhook);
}
}
}

No comments:

Post a Comment