在 windows 桌面上围绕鼠标光标画圈
draw circle around mouse cursor on windows desktop
对于演示项目,如何在鼠标单击事件时围绕鼠标光标绘制一个临时圆圈(N.B。不仅在表单上,也在 Windows 桌面上)
例如'onMouseClick'活动中出现的CamStudio圈子。
或者像 windows PSR.exe 为 运行.
时鼠标光标周围出现的圆圈
一些用户推荐了一个透明的表单来轻松管理
onMouseClick 事件。
在我看来,出于某些原因,这是一个错误的解决方案。
最主要的是,如果你创建一个透明的表格,看起来很
难以管理点击事件,例如在任务栏中(如指出的
在这些其他讨论中)
Form background transparency but still have click events
Keep form always on top of taskbar
从我的角度来看,直觉上 'hooks' 的解决方案是
非托管代码,如 Microsoft 此处所建议
https://support.microsoft.com/en-us/help/318804/how-to-set-a-windows-hook-in-visual-c-net,
是最好的解决方案。
应该足够管理两个事件:鼠标点击,和事件
启用/禁用 mouseSonar。
没有透明表单被锁定为活动状态Windows,然后点击
任务栏,给出正确的结果。
但老实说,我是.net的初学者,我不知道非托管代码在高级编程中的重要性。
在我看来会有第三种解决方案(我认为的那个
应该是最好的)
如果有一个class可以使管理
onMouseClick 事件也在 UI 表单边界之外,鼠标单击可能是
使用 'safe' 代码进行管理。
例如,System.Windows.Input.MouseDevice class,还有一个属性 'OverrideCursor',允许为整个应用程序设置光标。
但是 Microsoft 备注:'MouseDevice 支持 Windows
Presentation Foundation (WPF),不打算用于
直接来自您的代码。'
----------------------------更新
感谢用户的帮助,在此link
我们找到了一种通过代码设置 'Show location of pointer when I press the Ctrl key' (MOUSESONAR) 的方法。
任何帮助...
转到您的鼠标属性并启用 "Show location of pointer when I press the CTRL key"。
如果您按下 CTRL,您的鼠标指针周围会出现一个圆圈并停留片刻。
我没有时间在我的旧项目中搜索,但我过去做过类似的事情。
您不能像您希望的那样使用 .NET 在屏幕上绘图。
作为解决方法,我所做的是创建一个无边框全屏透明 window。您应该能够毫不费力地将它悬停在任务栏上。然后围绕光标进行跟踪和绘制。
我建议不要移动表单,因为我当时无法完全避免任务栏问题。
使用WPF绘图,因为它会使用硬件加速。 winForm 不会。 WPF 在表单放置方面也更加灵活,可以悬停在任务栏上并可以点击。
当我开始做这个问题时,我收集到的最多的建议是'change to WPF'。
看来要管理整个桌面(还有任务栏)的mouseClick事件在WinForm应用程序中做起来并不那么简单。
在这方面我在这里找到了帮助
在我看来处理 'Desktop Mouse click',这在 WinForm 应用程序中并不容易,最好的方法应该是从 WinForm 更改为 WPF...
但我不打算改变。
从另一方面来看,在我看来,其他一些开发人员(可能是熟练的)从另一个角度处理这个问题:WinForm 和 windows [=100= 之间的 'hook' 交互](非托管代码)。
我在这里找到了起始页:
https://support.microsoft.com/en-us/help/319524/how-to-set-a-hook-in-visual-basic-net
在这里找到了一个不错的link
http://joelabrahamsson.com/detecting-mouse-and-keyboard-input-with-net/
这里有一个非常好的和深刻的解释:
特别是阅读最后一页,让我意识到深入学习如何构建 'well managed hook' 代码的方式对于像我这样的编程水平的人来说非常困难。
所以在这一点上,我面临两种方式:
首先是从 WinForm 更改为 WPF...
其次是深入学习了WinForm与Windws的交互API(对我来说太多了)
但我认为还有另一种方法,我可以在 vb.net/c# 中继续开发,并且可以在很短的时间内构建我的应用程序。
使用已经构建的库:谷歌搜索...
http://nugetmusthaves.com/Tag/hook
我测试了一些,然后我选择了 MouseKeyHook(免费)
http://nugetmusthaves.com/Package/MouseKeyHook
在几行代码中,我找到了解决方案。
我想指出,在这种模式下,我没有学习 WinForm 和 Windows Api 之间的交互方式。
我只学习了让我使用这个库的那几个命令。
我认为这个答案可以帮助很多不同的用户,他们有不同的需求:谁需要切换到 WPF,谁需要深入学习,谁需要快速的方法。
这里是代码。
Imports Gma.System.MouseKeyHook
Public Class Form1
Dim m_GlobalHook As IKeyboardMouseEvents
Private Sub Subscribe()
m_GlobalHook = Hook.GlobalEvents()
AddHandler m_GlobalHook.MouseClick, AddressOf m_GlobalHook_MouseClick
End Sub
Private Sub m_GlobalHook_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs)
End Sub
Public Sub Unsubscribe()
RemoveHandler m_GlobalHook.MouseClick, AddressOf m_GlobalHook_MouseClick
m_GlobalHook.Dispose()
End Sub
End Class
您可以在此处找到文档:
https://github.com/gmamaladze/globalmousekeyhook
完全免费的许可证(MIT 许可证),只有作者的注释
'上述版权声明和本许可声明应包含在
软件的所有副本或重要部分。
我发现的唯一坏处是实时防病毒 Avira 保护,警报误报。
我想是 'hook' 例程,因为我只是尝试编译并执行我自己的编码例程 'WindowsHookEx',而 Avira 将 .exe 捕获为误报。
还在 VirusTotal 上进行了测试,使用 Avira 扫描也给出了 100% 干净 (0/67)。
N.B。我忘记在另一个 Post
中报告帮助 NineBerry gave me with his MouseSonar 代码
#Region "mouseSonar"
Private Sub mouseHook_Click(sender As Object, e As EventArgs)
End Sub
Private Sub EnableMouseSonar()
SetMouseSonarEnabled(True)
End Sub
Private Sub DisableMouseSonar()
SetMouseSonarEnabled(False)
End Sub
<DllImport("user32.dll", SetLastError:=True)>
Private Shared Function SystemParametersInfo(ByVal uiAction As UInteger, ByVal uiParam As UInteger, ByVal pvParam As UInteger, ByVal fWinIni As UInteger) As Boolean
End Function
Private Sub SetMouseSonarEnabled(ByVal enable As Boolean)
Const SPI_SETMOUSESONAR As UInteger = 4125
Const SPIF_UPDATEINIFILE As UInteger = 1
Const SPIF_SENDCHANGE As UInteger = 2
If Not SystemParametersInfo(SPI_SETMOUSESONAR, 0, CUInt((If(enable, 1, 0))), SPIF_UPDATEINIFILE Or SPIF_SENDCHANGE) Then
Throw New Win32Exception()
End If
End Sub
#End Region
所以,在我看来,只需调用这三个过程,在 MouseClick 事件中,在 WinForm 之外的 mouseClick 上获得一个圆圈,就可以毫无问题地管理透明胶片、表单、与任务栏的交互和编码。
Private Sub m_GlobalHook_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs)
EnableMouseSonar()
SendKeys.Send("^")
DisableMouseSonar()
End Sub
对于演示项目,如何在鼠标单击事件时围绕鼠标光标绘制一个临时圆圈(N.B。不仅在表单上,也在 Windows 桌面上)
例如'onMouseClick'活动中出现的CamStudio圈子。 或者像 windows PSR.exe 为 运行.
时鼠标光标周围出现的圆圈一些用户推荐了一个透明的表单来轻松管理 onMouseClick 事件。
在我看来,出于某些原因,这是一个错误的解决方案。
最主要的是,如果你创建一个透明的表格,看起来很 难以管理点击事件,例如在任务栏中(如指出的 在这些其他讨论中)
Form background transparency but still have click events
Keep form always on top of taskbar
从我的角度来看,直觉上 'hooks' 的解决方案是 非托管代码,如 Microsoft 此处所建议 https://support.microsoft.com/en-us/help/318804/how-to-set-a-windows-hook-in-visual-c-net, 是最好的解决方案。
应该足够管理两个事件:鼠标点击,和事件 启用/禁用 mouseSonar。
没有透明表单被锁定为活动状态Windows,然后点击 任务栏,给出正确的结果。
但老实说,我是.net的初学者,我不知道非托管代码在高级编程中的重要性。
在我看来会有第三种解决方案(我认为的那个 应该是最好的)
如果有一个class可以使管理 onMouseClick 事件也在 UI 表单边界之外,鼠标单击可能是 使用 'safe' 代码进行管理。
例如,System.Windows.Input.MouseDevice class,还有一个属性 'OverrideCursor',允许为整个应用程序设置光标。
但是 Microsoft 备注:'MouseDevice 支持 Windows Presentation Foundation (WPF),不打算用于 直接来自您的代码。'
----------------------------更新
感谢用户的帮助,在此link
我们找到了一种通过代码设置 'Show location of pointer when I press the Ctrl key' (MOUSESONAR) 的方法。
任何帮助...
转到您的鼠标属性并启用 "Show location of pointer when I press the CTRL key"。
如果您按下 CTRL,您的鼠标指针周围会出现一个圆圈并停留片刻。
我没有时间在我的旧项目中搜索,但我过去做过类似的事情。
您不能像您希望的那样使用 .NET 在屏幕上绘图。
作为解决方法,我所做的是创建一个无边框全屏透明 window。您应该能够毫不费力地将它悬停在任务栏上。然后围绕光标进行跟踪和绘制。
我建议不要移动表单,因为我当时无法完全避免任务栏问题。
使用WPF绘图,因为它会使用硬件加速。 winForm 不会。 WPF 在表单放置方面也更加灵活,可以悬停在任务栏上并可以点击。
当我开始做这个问题时,我收集到的最多的建议是'change to WPF'。
看来要管理整个桌面(还有任务栏)的mouseClick事件在WinForm应用程序中做起来并不那么简单。
在这方面我在这里找到了帮助
在我看来处理 'Desktop Mouse click',这在 WinForm 应用程序中并不容易,最好的方法应该是从 WinForm 更改为 WPF...
但我不打算改变。
从另一方面来看,在我看来,其他一些开发人员(可能是熟练的)从另一个角度处理这个问题:WinForm 和 windows [=100= 之间的 'hook' 交互](非托管代码)。
我在这里找到了起始页:
https://support.microsoft.com/en-us/help/319524/how-to-set-a-hook-in-visual-basic-net
在这里找到了一个不错的link
http://joelabrahamsson.com/detecting-mouse-and-keyboard-input-with-net/
这里有一个非常好的和深刻的解释:
特别是阅读最后一页,让我意识到深入学习如何构建 'well managed hook' 代码的方式对于像我这样的编程水平的人来说非常困难。
所以在这一点上,我面临两种方式:
首先是从 WinForm 更改为 WPF...
其次是深入学习了WinForm与Windws的交互API(对我来说太多了)
但我认为还有另一种方法,我可以在 vb.net/c# 中继续开发,并且可以在很短的时间内构建我的应用程序。
使用已经构建的库:谷歌搜索...
http://nugetmusthaves.com/Tag/hook
我测试了一些,然后我选择了 MouseKeyHook(免费)
http://nugetmusthaves.com/Package/MouseKeyHook
在几行代码中,我找到了解决方案。
我想指出,在这种模式下,我没有学习 WinForm 和 Windows Api 之间的交互方式。
我只学习了让我使用这个库的那几个命令。
我认为这个答案可以帮助很多不同的用户,他们有不同的需求:谁需要切换到 WPF,谁需要深入学习,谁需要快速的方法。
这里是代码。
Imports Gma.System.MouseKeyHook
Public Class Form1
Dim m_GlobalHook As IKeyboardMouseEvents
Private Sub Subscribe()
m_GlobalHook = Hook.GlobalEvents()
AddHandler m_GlobalHook.MouseClick, AddressOf m_GlobalHook_MouseClick
End Sub
Private Sub m_GlobalHook_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs)
End Sub
Public Sub Unsubscribe()
RemoveHandler m_GlobalHook.MouseClick, AddressOf m_GlobalHook_MouseClick
m_GlobalHook.Dispose()
End Sub
End Class
您可以在此处找到文档:
https://github.com/gmamaladze/globalmousekeyhook
完全免费的许可证(MIT 许可证),只有作者的注释 '上述版权声明和本许可声明应包含在 软件的所有副本或重要部分。
我发现的唯一坏处是实时防病毒 Avira 保护,警报误报。 我想是 'hook' 例程,因为我只是尝试编译并执行我自己的编码例程 'WindowsHookEx',而 Avira 将 .exe 捕获为误报。
还在 VirusTotal 上进行了测试,使用 Avira 扫描也给出了 100% 干净 (0/67)。
N.B。我忘记在另一个 Post
中报告帮助 NineBerry gave me with his MouseSonar 代码#Region "mouseSonar"
Private Sub mouseHook_Click(sender As Object, e As EventArgs)
End Sub
Private Sub EnableMouseSonar()
SetMouseSonarEnabled(True)
End Sub
Private Sub DisableMouseSonar()
SetMouseSonarEnabled(False)
End Sub
<DllImport("user32.dll", SetLastError:=True)>
Private Shared Function SystemParametersInfo(ByVal uiAction As UInteger, ByVal uiParam As UInteger, ByVal pvParam As UInteger, ByVal fWinIni As UInteger) As Boolean
End Function
Private Sub SetMouseSonarEnabled(ByVal enable As Boolean)
Const SPI_SETMOUSESONAR As UInteger = 4125
Const SPIF_UPDATEINIFILE As UInteger = 1
Const SPIF_SENDCHANGE As UInteger = 2
If Not SystemParametersInfo(SPI_SETMOUSESONAR, 0, CUInt((If(enable, 1, 0))), SPIF_UPDATEINIFILE Or SPIF_SENDCHANGE) Then
Throw New Win32Exception()
End If
End Sub
#End Region
所以,在我看来,只需调用这三个过程,在 MouseClick 事件中,在 WinForm 之外的 mouseClick 上获得一个圆圈,就可以毫无问题地管理透明胶片、表单、与任务栏的交互和编码。
Private Sub m_GlobalHook_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs)
EnableMouseSonar()
SendKeys.Send("^")
DisableMouseSonar()
End Sub