Ejemplo n.º 1
0
        public WindowMonitor()
        {
            _foregroundWindowChanged = (hook, type, hwnd, idObject, child, thread, time) =>
            {
                // ignore any event not pertaining directly to the window
                if (idObject != User32.NativeMethods.OBJID_WINDOW)
                {
                    return;
                }

                // Ignore if this is a bogus hwnd (shouldn't happen)
                if (hwnd == IntPtr.Zero)
                {
                    return;
                }
                var(processId, windowText, windowClass) = ProcessWindowInformation(hwnd);

                //Couldn't find the processId of the window
                if (processId == 0)
                {
                    return;
                }

                Task.Factory.StartNew(() =>
                {
                    try
                    {
                        var process     = Process.GetProcessById((int)processId);
                        var processName = process.MainModule?.FileName ?? "N/A";
                        ForegroundChanged?.Invoke(this, new Event(processId, processName, windowText, windowClass, hwnd));
                    }
                    catch (Exception e)
                    {
                        Log.Warning(e, "Couldn't get info about foreground process");
                    }
                });
            };

            ComThread.Invoke(() =>
            {
                User32.NativeMethods.SetWinEventHook(User32.NativeMethods.EVENT_SYSTEM_MINIMIZEEND,
                                                     User32.NativeMethods.EVENT_SYSTEM_MINIMIZEEND,
                                                     IntPtr.Zero, _foregroundWindowChanged,
                                                     0,
                                                     0,
                                                     User32.NativeMethods.WINEVENT_OUTOFCONTEXT);

                User32.NativeMethods.SetWinEventHook(User32.NativeMethods.EVENT_SYSTEM_FOREGROUND,
                                                     User32.NativeMethods.EVENT_SYSTEM_FOREGROUND,
                                                     IntPtr.Zero, _foregroundWindowChanged,
                                                     0,
                                                     0,
                                                     User32.NativeMethods.WINEVENT_OUTOFCONTEXT);
            });
        }
Ejemplo n.º 2
0
        public ForegroundProcess()
        {
            _winEventDelegate = (hook, type, hwnd, idObject, child, thread, time) =>
            {
                var windowProcessId = ComThread.Invoke(() =>
                {
                    try
                    {
                        User32.NativeMethods.GetWindowThreadProcessId(hwnd, out var processId);
                        return(processId);
                    }
                    catch
                    {
                        return((uint)0);
                    }
                });

                if (windowProcessId == 0)
                {
                    return;
                }

                Task.Factory.StartNew(() =>
                {
                    var process     = Process.GetProcessById((int)windowProcessId);
                    var processName = process.MainModule?.FileName ?? "N/A";
                    Changed?.Invoke(this, new Event(windowProcessId, processName));
                });
            };

            ComThread.Invoke(() =>
            {
                User32.NativeMethods.SetWinEventHook(User32.NativeMethods.EVENT_SYSTEM_MINIMIZEEND,
                                                     User32.NativeMethods.EVENT_SYSTEM_MINIMIZEEND,
                                                     IntPtr.Zero, _winEventDelegate,
                                                     0,
                                                     0,
                                                     User32.NativeMethods.WINEVENT_OUTOFCONTEXT);

                User32.NativeMethods.SetWinEventHook(User32.NativeMethods.EVENT_SYSTEM_FOREGROUND,
                                                     User32.NativeMethods.EVENT_SYSTEM_FOREGROUND,
                                                     IntPtr.Zero, _winEventDelegate,
                                                     0,
                                                     0,
                                                     User32.NativeMethods.WINEVENT_OUTOFCONTEXT);
            });
        }
Ejemplo n.º 3
0
 public WinEventHookHelper(User32.NativeMethods.SystemEvents evt)
 {
     this.evt = evt;
     evtProc  = new User32.NativeMethods.WinEventDelegate(EventProc);
 }