- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我的 C# WinForms 应用程序正在运行时,我需要检测鼠标指针何时移到第 3 方应用程序上。
我已经进行了一些 Google 搜索,但我似乎无法找到一个有用的代码示例来说明如何使用 C# 为另一个应用程序设置一个 Hook Procedure 以检测 Windows 消息。
有人可以告诉我如何设置 C# Hook 程序,以便我可以检测另一个应用程序(例如 Notepad.exe)上的 WM_MOUSEMOVE 消息吗?
最佳答案
下面是我正在寻找的 C# 低级鼠标钩子(Hook)代码,来自 blogs.msdn.com/b/toub/archive/2006/05/03/589468.aspx链接(David 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);
}
关于c# - 在不同的窗口检测 WM_MOUSEMOVE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28497289/
我想使用 SetCursorPos 将鼠标困在窗口中间(就像在 FPS 游戏中一样) . 问题是,当我这样做时,我的窗口会收到一个 WM_MOUSEMOVE ——这最多会抵消用户想要的任何移动,最坏的
我正在开发一个程序,该程序应该在程序停留在后台时模拟程序的基本鼠标输入(这意味着,我想在目标接收输入时使用实际的鼠标和键盘在其他窗口中执行其他操作) 。我需要做的一件事是将鼠标移动到特定的 (x,y)
我正在尝试用 C++ 和 WinAPI 制作一个透明的屏幕保护程序。 到目前为止它在 Windows XP 上运行良好,但在 WES7 上我遇到以下问题:通过使我的屏幕透明,我无法接收任何 WM_MO
我有以下WndProc: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM w, LPARAM l) { switch (mes
当我的 C# WinForms 应用程序正在运行时,我需要检测鼠标指针何时移到第 3 方应用程序上。 我已经进行了一些 Google 搜索,但我似乎无法找到一个有用的代码示例来说明如何使用 C# 为另
现在我正在做一个项目,它要求我始终获取鼠标移动消息。我的应用程序只有一个用于配置目的的小窗口,大部分时间它甚至不会出现在桌面上。我需要的是我需要能够记录鼠标在桌面上的移动。这意味着人们在桌面上移动鼠标
我正在尝试实现一个功能,用户按下鼠标左键,将鼠标拖到某处,然后绘制一个“带边框的矩形”(没有任何填充的矩形显示下面的内容,所以基本上只是一个边框) . 我有东西使用这段代码: cas
你好, 绘制鼠标移动的最佳做法是什么?当在 WM_MOUSEMOVE 中执行绘图时,我看到很多示例(也在 MSDN 上)。但我认为更好的方法是在 WM_PAINT 中绘制。 例子: 版本 1 case
当将 WM_MOUSEMOVE 消息发送到应用程序(在本例中为 Open Office Writer)的客户区时,图像会闪烁,就好像鼠标位于指定坐标上一样,但不会停留在该状态。代码是: PostMes
我有一个(父)窗口,其中一个子窗口是由另一个库(Ogre3d)创建的。窗口初始化使用裸 Win32 API。 我想在我的父窗口中捕获鼠标输入,但似乎我的 WM_MOUSEMOVE 事件仅由子窗口接收,
我正在处理 Win32 控件。此控件上可能有数百个“项目”。这些不是窗口,而是内部对象(例如:矩形)。根据鼠标位置,我想更改鼠标光标。没关系,我可以使用 WM_SETCURSOR。 同时基于鼠标移动,
我正在试验 WM_TOUCH 并想检测鼠标事件是从触摸/笔事件合成还是由于实际鼠标事件。 官方根据MSDN解决是检查 GetMessageExtraInfo() 的结果是否将高 24 位设置为 0xF
我正在试验 WM_TOUCH 并想检测鼠标事件是从触摸/笔事件合成还是由于实际鼠标事件。 官方根据MSDN解决是检查 GetMessageExtraInfo() 的结果是否将高 24 位设置为 0xF
我的对话框派生自 CDialog,我想在用户将鼠标光标移开时关闭它。为此,我添加了调用 OnCancel() 的 OnMouseLeave 处理程序。据我了解,要及时发送 WM_MOUSELEAVE
大家好,我正在尝试实现 FPS=Style 相机。鼠标移动有效,但甚至没有接触鼠标。在我什至没有触碰鼠标的情况下,相机在各个角度都在运转。基本上,偏航和俯仰是在没有鼠标本身移动的情况下从鼠标获得错误的
我正在使用一个粗糙的系统通过将 WM_MOUSEMOVE 事件直接发送到 Flash 窗口来从 C++/win32 程序控制 Flash 电影。 它适用于一个轴: SendMessage( m_tar
我在这里看了很多关于 PeekMessage 和 WM_MOUSEMOVE 的帖子,但到目前为止我还没有发现任何与性能相关的内容。 长话短说;我正在做 PC 游戏开发,昨天我注意到我可以将我们的应用程
我是一名优秀的程序员,十分优秀!