【问题标题】:Monitor Cursor Position system wide监控光标位置系统范围
【发布时间】:2023-03-25 03:44:01
【问题描述】:

我需要制作一个小型系统托盘应用程序,它可以监视系统范围内的光标位置,并根据光标句柄 ID 显示或隐藏屏幕键盘。例如,如果光标在 IE 中的文本框(位置等于 IBeam)中,则弹出键盘。 我有系统托盘应用程序(无格式应用程序)的代码,但找不到让它监视系统的方法。任何有关监视系统光标位置功能的帮助都将受到欢迎。谢谢。

【问题讨论】:

  • 使用标准的TextBox可以轻松完成,但使用WPF中的TextBox等某种复合TextBox就不容易了。
  • 只需在计时器的 Tick 事件处理程序中使用 Cursor.Position。
  • 请提供示例代码?

标签: c# cursor monitoring


【解决方案1】:

监控系统光标位置:

            private void Pos()
            {
                for (; ; )
                {
                    Thread.Sleep(10);
                    Point position = Cursor.Position;
//You can use these to pass to your system tray or whereever you need it.
                    somePublicXVar = position.X; 
                    somePublicYVar = position.Y; 
                }

            }
            public void PointPosition()
            {
                Thread pointThread = new Thread(new ThreadStart(Pos));
                pointThread.Start();
            }

【讨论】:

  • 循环占用大量 CPU !!
  • 根据您的需要,您应该尝试为 Thread.Sleep(MinMilisecondsYouCanAfford) 使用更高的数字。希望对您有所帮助。
  • 需要的是:只要我的光标位于任何应用程序的教科书上,屏幕键盘就会像平板电脑一样出现。 Windows Metro 完美,但桌面模式缺少此功能。
  • @Regu 或设置一个滴答事件,例如 Hans Passant 对原始帖子的评论。
  • 重新使用了带有条件和 cursor.position 的代码。如果我使用 .Position 位置会随着鼠标移动而变化,但如果我想要 cursor.handle 手柄不会改变。
【解决方案2】:

要成为事件驱动的,您需要使用SetWindowsHookEx。您不能直接通过 .NET 执行此操作,而必须注入 DLL。这是MSDN article on making a mouse hook。这是使用System.Runtime.InteropServices 导入user32.dll 完成的。 MSDN 文章提供了有关从 C# 调用 SetWindowsHookExCallNextHookExUnhookWindowsHookEx 的分步说明。 CodeProject 在making system-wide hooks in .NET也有文章。

【讨论】:

  • 我认为您不想查看光标句柄,而是对鼠标位置进行命中测试。看看这个SO post about WindowFromPoint
  • 找到一个人在 C++ 中寻找同样的东西。有人将代码转换为c#吗?我确实使用了转换器,但不确定它是否完成了所有必要的转换: LRESULT CALLBACK winProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode message == WM_COMMAND) && (HIWORD(msg->wParam) == EN_SETFOCUS)) MessageBox(NULL, "focus !", "Information", MB_ICONINFORMATION); } return CallNextHookEx(hhk, nCode, wParam, lParam); }
  • @JoeCoder 看看我提到的 MSDN 文章。它展示了如何从 C# 调用这些函数。
猜你喜欢
  • 2014-06-04
  • 2014-07-01
  • 2019-06-21
  • 2011-11-01
  • 2016-11-12
  • 2011-12-10
  • 2012-07-05
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多