2013-10-01 2 views
0

Я хочу создать приложение, работающее в фоновом режиме, и будет захватывать все события click на кнопке минимизации всех открытых форм/окон, которые фактически запущены. (не только в моем текущем приложении)Как захватить событие clicks в другом окошке, которое было сведено к минимуму

это будет какой-то крючок, чтобы добавить минимизирующий обработчик ко всем другим окнам.

Как установить такой крюк? (пожалуйста, укажите пример кода в csharp с маршелином)

Чтобы лучше понять идею: эта процедура уже существует в программе TrayIt, которая обрабатывает Ctrl + Click на кнопке «Свернуть» и отправляет программы в системный трей.

EDIT:

я обнаружил, что SetWindowsHookEx не может установить глобальный хук с C# из-за ограничений в сведущих коде (смотрите в документации MSDN)

но может WinEventProc с EVENT_OBJECT_STATECHANGE должны сделайте работу

ответ

0

finely я нашел решение для этого крюка, это не лучшее решение, которое я могу получить bu т это сделать работу

Я смешал window_state_change в SetWinEventHook

и компонент для отслеживания ключа управления в Gma.UserActivityMonitor

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Text; 
using System.Windows.Forms; 
using System.Windows; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Security.Permissions; 
using Gma.UserActivityMonitor; 

namespace example { 
    public partial class Form1 : Form { 
     public Form1() { 
      InitializeComponent(); 
     } 

     public const uint WINEVENT_OUTOFCONTEXT = 0; 
     public const uint EVENT_OBJECT_STATECHANGE = 0x800A; 
     [DllImport("user32.dll")] 
     public static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags); 
     [DllImport("user32.dll")] 
     public static extern bool UnhookWinEvent(IntPtr hWinEventHook); 

     public delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime); 

     public static bool ControlDown = false; 
     public static IntPtr hhook; 
     static WinEventDelegate procDelegate = new WinEventDelegate(WinEventProc); 

     private void load(object sender, System.EventArgs e) { 
      hhook = SetWinEventHook(EVENT_OBJECT_STATECHANGE, EVENT_OBJECT_STATECHANGE, IntPtr.Zero, procDelegate, 0, 0, winapi.WINEVENT_OUTOFCONTEXT); 
      HookManager.KeyDown += HookManager_KeyDown; 
      HookManager.KeyUp += HookManager_KeyUp; 
     } 
     private void closing(object sender, System.Windows.Forms.FormClosingEventArgs e) { 
      UnhookWinEvent(hhook); 

      HookManager.KeyDown -= HookManager_KeyDown; 
      HookManager.KeyUp -= HookManager_KeyUp; 
     } 
     private void HookManager_KeyUp(object sender, KeyEventArgs e) { 
      if (e.KeyCode == Keys.LControlKey) { ControlDown = false; } 
     } 
     private void HookManager_KeyDown(object sender, KeyEventArgs e) { 
      if (e.KeyCode == Keys.LControlKey) { ControlDown = true; } 
     } 

     static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) { 
      if (idObject == -2 && idChild == 2) { 
       if (ControlDown) { 

        // HookWindow(hwnd); 
        ..... 
       } 

      } 
     } 
    } 
} 

, если вы хотите, вы можете установить простой крюк с RegisterHotKey

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, uint vk); 
Смежные вопросы