从 setwindowhook 获取窗口标题
get findow title from setwindowhook
首先我不确定我这样做是否正确(setSetWindowsHookEx)。
我想收到从进程(第三方应用程序)创建的所有 windows 的通知,并获取标题以查看它是否是 window 我想做的事情,如果是然后得到他的位置并在其上放置一些表单和 SetWinEventHook,因此如果此 window 移动,表单将在 window 上保持蜂鸣。
如何从新 window 获取标题?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public enum HookType : int
{
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
}
public enum ShellEvents : int {
HSHELL_WINDOWCREATED = 1,
HSHELL_WINDOWDESTROYED = 2,
HSHELL_ACTIVATESHELLWINDOW = 3,
HSHELL_WINDOWACTIVATED = 4,
HSHELL_GETMINRECT = 5,
HSHELL_REDRAW = 6,
HSHELL_TASKMAN = 7,
HSHELL_LANGUAGE = 8,
HSHELL_ACCESSIBILITYSTATE = 11
}
private delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
static IntPtr hHook;
HookProc myCallbackDelegate;
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
//const int HSHELL_WINDOWCREATED = 1;
public int MyCallbackFunction(int nCode, IntPtr wParam, IntPtr lParam)
{
if (Convert.ToInt32 (nCode) >0 )//HSHELL_WINDOWCREATED)
{
//MessageBox.Show("hola");
}
//Is this correct or should be on a else?
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
private void Form1_Load(object sender, EventArgs e)
{
myCallbackDelegate = new HookProc(MyCallbackFunction);
processHandle);
hHook = SetWindowsHookEx(HookType.WH_SHELL, myCallbackDelegate, (IntPtr)0,GetCurrentThreadId());
}
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool UnhookWindowsHookEx(IntPtr hhk);
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnhookWindowsHookEx(hHook);
}
}
SetWindowsHookEx 是一个赋予安装挂钩权利的函数(局部而非全局,鼠标和键盘除外))
要获得 windows 的标题,您可以使用
link List Processes
首先我不确定我这样做是否正确(setSetWindowsHookEx)。 我想收到从进程(第三方应用程序)创建的所有 windows 的通知,并获取标题以查看它是否是 window 我想做的事情,如果是然后得到他的位置并在其上放置一些表单和 SetWinEventHook,因此如果此 window 移动,表单将在 window 上保持蜂鸣。 如何从新 window 获取标题?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public enum HookType : int
{
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
}
public enum ShellEvents : int {
HSHELL_WINDOWCREATED = 1,
HSHELL_WINDOWDESTROYED = 2,
HSHELL_ACTIVATESHELLWINDOW = 3,
HSHELL_WINDOWACTIVATED = 4,
HSHELL_GETMINRECT = 5,
HSHELL_REDRAW = 6,
HSHELL_TASKMAN = 7,
HSHELL_LANGUAGE = 8,
HSHELL_ACCESSIBILITYSTATE = 11
}
private delegate int HookProc(int code, IntPtr wParam, IntPtr lParam);
static IntPtr hHook;
HookProc myCallbackDelegate;
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetWindowsHookEx(HookType hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern int CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[System.Runtime.InteropServices.DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
//const int HSHELL_WINDOWCREATED = 1;
public int MyCallbackFunction(int nCode, IntPtr wParam, IntPtr lParam)
{
if (Convert.ToInt32 (nCode) >0 )//HSHELL_WINDOWCREATED)
{
//MessageBox.Show("hola");
}
//Is this correct or should be on a else?
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
private void Form1_Load(object sender, EventArgs e)
{
myCallbackDelegate = new HookProc(MyCallbackFunction);
processHandle);
hHook = SetWindowsHookEx(HookType.WH_SHELL, myCallbackDelegate, (IntPtr)0,GetCurrentThreadId());
}
[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool UnhookWindowsHookEx(IntPtr hhk);
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
UnhookWindowsHookEx(hHook);
}
}
SetWindowsHookEx 是一个赋予安装挂钩权利的函数(局部而非全局,鼠标和键盘除外))
要获得 windows 的标题,您可以使用 link List Processes