C# code (Vb ist auch nicht wirklich anders)
PHP Code:
class WindowPicker
{
static object o = new object();
static POINT point = new POINT();
static IntPtr hhook = (IntPtr)0;
static AutoResetEvent klicked = new AutoResetEvent(false);
static LowLevelMouseProc mProc = MouseHookCallback;
public static IntPtr PickWindow()
{
lock (o)
{
hhook = SetMouseHook(mProc);
klicked.WaitOne();
UnhookWindowsHookEx(hhook);
return WindowFromPoint(point);
}
}
public static Process GetProcFromWindow(IntPtr hwnd)
{
int ProcID;
GetWindowThreadProcessId(hwnd, out ProcID);
return Process.GetProcessById(ProcID);
}
/// <summary>
///
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private delegate IntPtr LowLevelMouseProc(
int nCode, IntPtr wParam, IntPtr lParam);
/// <summary>
/// diese methode wird jedesmal aufgerufen sobald jmd. die Maus bewegt
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private static IntPtr MouseHookCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{ //Marshall the data from the callback.
MouseHookStruct MyMouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
if (nCode < 0)
{
return CallNextHookEx(hhook, nCode, wParam, lParam);
}
else
{
if (wParam.ToInt32() == Constants.WM_LBUTTONDOWN)
{
int x = MyMouseHookStruct.pt.x;
int y = MyMouseHookStruct.pt.y;
point = new POINT();
point.x = x;
point.y = y;
klicked.Set();
}
return CallNextHookEx(hhook, nCode, wParam, lParam);
}
}
/// <summary>
/// setett den maus Hook
/// </summary>
/// <param name="proc">ein Pointer uf eine funktion, die bei jeder Mausbewgung ausgeführt werden soll</param>
/// <returns></returns>
private static IntPtr SetMouseHook(LowLevelMouseProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(
Repeater.Constants.WH_MOUSE_LL,
proc,
GetModuleHandle(curModule.ModuleName),
0);
}
}
/// <summary>
/// die Windosmethode um systemweite Hooks zu setzen
/// </summary>
/// <param name="idHook"></param>
/// <param name="lpfn"></param>
/// <param name="hMod"></param>
/// <param name="dwThreadId"></param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook,
LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId);
/// <summary>
/// die Windosmethode um systemweite Hooks wieder aufzulösen
/// </summary>
/// <param name="hhk"></param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
/// <summary>
/// die Windosmethode, die am ende jeder hookfunktion gerufen werden muss
/// </summary>
/// <param name="hhk"></param>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);
/// <summary>
/// die Windosmethode, um weiss ich grad nicht
/// </summary>
/// <param name="lpModuleName"></param>
/// <returns></returns>
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll")]
static extern IntPtr WindowFromPoint(POINT Point);
[DllImport("User32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, out int procID);
}
//Declare the wrapper managed MouseHookStruct class.
[StructLayout(LayoutKind.Sequential)]
public struct MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int x;
public int y;
}