在Windows桌面上绘制鼠标光标周围的圆圈

时间:2018-03-05 09:55:53

标签: c# windows vb.net hook

对于演示项目,如何在鼠标单击事件周围绘制临时圆圈(N.B.非仅在表单上,​​也在Windows桌面上)

例如,就像出现在'onMouseClick'事件中的CamStudio圈子一样。 或者类似于Windows PSR.exe运行时在单击事件中鼠标光标周围出现的圆圈。

  1. 有些用户建议使用透明表单来轻松管理 onMouseClick事件。

    在我看来,由于某些原因,这是一个错误的解决方案。

    主要的是,如果你创建一个透明的表格,就会显得非常 难以管理点击事件,例如在任务栏中(如所指出的那样) 在这些其他讨论中)

    Form background transparency but still have click events

    Keep form always on top of taskbar

  2. 从我的角度来看,直观地说,'钩子'的解决方案 非托管代码,正如微软在这里所建议的那样 https://support.microsoft.com/en-us/help/318804/how-to-set-a-windows-hook-in-visual-c-net, 是最好的解决方案。

    应该足够管理两个事件:鼠标单击和事件 启用/禁用mouseSonar。

    没有透明表单被锁定为活动Windows,然后单击 任务栏,给出正确的结果。

    但老实说,我是.net的初学者,我不知道在高级编程中非托管代码的重要程度。

  3. 在我看来,会有第三种解决方案(我认为是这样的解决方案) 应该是最好的)

    如果有一个班级可以管理 onMouseClick事件也在UI表单边界之外,鼠标单击它即可 使用“安全”代码进行管理。

    例如,System.Windows.Input.MouseDevice类,还有一个属性'OverrideCursor',允许为整个应用程序设置Cursor。

    但微软备注:'MouseDevice支持Windows Presentation Foundation(WPF)并不打算使用 直接来自你的代码。'

  4. ----------------------------更新

    感谢用户的帮助,请访问此链接 https://stackoverflow.com/questions/49116171/show-location-of-pointer-when-i-press-the-ctrl-key-from-code

    我们找到了一种方法来设置'当我按下Ctrl键'(MOUSESONAR)时按代码显示指针的位置。

    任何帮助......

3 个答案:

答案 0 :(得分:1)

转到鼠标属性并启用“按CTRL键时显示指针的位置”。

如果按CTRL键,短时间内鼠标指针周围会出现一个cirlce。

How to on Win 10

How to on Win 7 + 8

答案 1 :(得分:1)

我没有时间在我的旧项目中搜索,但我过去做过类似的事情。

你不能像你想要的那样使用.NET在屏幕上绘图。

我所做的解决方法是创建一个无边框和全屏的透明窗口。你应该能够毫不费力地将它悬停在任务栏上。然后跟踪和绘制光标。

我建议不要移动表单,因为我当时无法完全避免任务栏问题。

使用WPF进行绘制,因为它将使用硬件加速。 winForm不会。 WPF在表单放置方面也更加灵活,可以悬停任务栏并可以点击。

答案 2 :(得分:0)

当我开始提出这个问题时,我收集的最多建议是改为WPF'

似乎要管理整个桌面(也就是任务栏)的mouseClick事件,在WinForm应用程序中做起来并不是那么简单。

在这方面,我在这里找到了帮助

https://social.msdn.microsoft.com/Forums/vstudio/en-US/30cfa752-3bec-41dd-94a4-07fc23dda688/how-to-run-a-form-over-and-beyond-the-windows-task-bar?forum=vbgeneral

对我来说,处理桌面鼠标点击',在WinForm应用程序中做起来并不那么容易,最好的方法应该是从WinForm更改为WPF ..

但我不打算改变。

从另一方面来看,在我看来,其他一些开发人员(可能是熟练的)以另一种观点来处理这个问题:' hook' WinForm和Windows API(非托管代码)之间的交互。

我在这里找到了一个起始页:

https://support.microsoft.com/en-us/help/319524/how-to-set-a-hook-in-visual-basic-net

在这里找到了一个很好的链接

http://joelabrahamsson.com/detecting-mouse-and-keyboard-input-with-net/

这里有一个非常好的和深刻的解释:

https://www.codeguru.com/vb/gen/vb_system/keyboard/article.php/c4831/Managing-LowLevel-Keyboard-Hooks-with-the-Windows-API-for-VB-NET.htm

特别是阅读最后一页,让我想一想深入学习如何建立一个管理良好的钩子的方法。对于具有我的编程水平的人来说,编码非常困难。

所以在这一点上,我面临两种方式:

第一个是从WinForm改为WPF ......

第二个是深入学习WinForm和Windws API之间的互动(对我来说太过分了)。

但我认为还有另一种方式,我可以继续在vb.net/c#中进行开发,我可以在很短的时间内构建我的应用程序。

使用已经建立的库:Google搜索...

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

许可证完全免费(麻省理工学院许可证),只有作者的说明 '上述版权声明和本许可声明应包含在内 本软件的所有副本或重要部分。'

我发现的唯一不好的事情是实时防病毒Avira保护,警告误报。 我想是' hook'例程,因为我试图编译并执行我自己的编码例程' WindowsHookEx',而Avira将.exe视为误报。

同样在VirusTotal上测试,使用Avira scansion也可以100%清洁(0/67)。

N.B。我忘了报告帮助NineBerry在另一篇帖子中向我提供了他的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外部的鼠标点击一个圆圈,没有问题来管理透明度,表单,与任务栏的交互和编码

Private Sub m_GlobalHook_MouseClick(ByVal sender As Object, ByVal e As MouseEventArgs)
    EnableMouseSonar()
    SendKeys.Send("^")
    DisableMouseSonar()
End Sub