2015-02-13 2 views
2

В то время как мое приложение C# WinForms запущено, мне нужно определить, когда указатель мыши перемещается по стороннему приложению.Обнаружение WM_MOUSEMOVE в другом окне

Я сделал несколько Google'ов, но я не могу найти полезный пример кода, который показывает, как настроить процедуру Hook для другого приложения с помощью C# для обнаружения сообщений Windows.

Может кто-нибудь, пожалуйста, покажите мне, как настроить процедуру крюка на C#, чтобы я мог обнаружить сообщение WM_MOUSEMOVE в другом приложении (например, Notepad.exe)?

+0

Есть, вероятно, множество способов решить вашу проблему. Это могло бы помочь нам выбрать лучший, если бы мы знали больше контекста. почему ты хочешь сделать это? –

+0

Когда указатель мыши перемещается по определенной области окна стороннего приложения, мне нужно отобразить окно, которое выглядит как всплывающая подсказка. Так что я подумал, могу ли я найти код C#, который показал мне, как захватить сообщение Windows WM_MOUSEMOVE , Тогда я мог бы работать, когда мышь была поверх стороннего приложения. Мне просто нужно следить за сообщениями Windows (и не нужно вносить какие-либо изменения в окно стороннего приложения). –

+0

Вы можете использовать крючок для мыши низкого уровня –

ответ

2

Ниже Крюк код C# Низкий уровень мыши я искал, из blogs.msdn.com/b/toub/archive/2006/05/03/589468.aspx ссылки (Давид Heffernan отправил)

class InterceptMouse 
{ 
    private static LowLevelMouseProc _proc = HookCallback; 
    private static IntPtr _hookID = IntPtr.Zero; 

    public static void Main() 
    { 
     _hookID = SetHook(_proc); 
     Application.Run(); 
     UnhookWindowsHookEx(_hookID); 
    } 

    private static IntPtr SetHook(LowLevelMouseProc proc) 
    { 
     using (Process curProcess = Process.GetCurrentProcess()) 
     using (ProcessModule curModule = curProcess.MainModule) 
     { 
      return SetWindowsHookEx(WH_MOUSE_LL, proc, 
       GetModuleHandle(curModule.ModuleName), 0); 
     } 
    } 

    private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); 

    private static IntPtr HookCallback(
     int nCode, IntPtr wParam, IntPtr lParam) 
    { 
     if (nCode >= 0 && 
      MouseMessages.WM_LBUTTONDOWN == (MouseMessages)wParam) 
     { 
      MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)); 
      Console.WriteLine(hookStruct.pt.x + ", " + hookStruct.pt.y); 
     } 
     return CallNextHookEx(_hookID, nCode, wParam, lParam); 
    } 

    private const int WH_MOUSE_LL = 14; 

    private enum MouseMessages 
    { 
     WM_LBUTTONDOWN = 0x0201, 
     WM_LBUTTONUP = 0x0202, 
     WM_MOUSEMOVE = 0x0200, 
     WM_MOUSEWHEEL = 0x020A, 
     WM_RBUTTONDOWN = 0x0204, 
     WM_RBUTTONUP = 0x0205 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    private struct POINT 
    { 
     public int x; 
     public int y; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    private struct MSLLHOOKSTRUCT 
    { 
     public POINT pt; 
     public uint mouseData; 
     public uint flags; 
     public uint time; 
     public IntPtr dwExtraInfo; 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr SetWindowsHookEx(int idHook, 
     LowLevelMouseProc lpfn, IntPtr hMod, uint dwThreadId); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    private static extern bool UnhookWindowsHookEx(IntPtr hhk); 

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, 
     IntPtr wParam, IntPtr lParam); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern IntPtr GetModuleHandle(string lpModuleName); 
} 
Смежные вопросы