none
ロック画面(スクリーンセーバー)でのマウスカーソル位置について RRS feed

  • 質問

  • こんにちは。お世話になります。

    マウスのカーソル位置を変更させるプログラムを作っているのですが、
    ロック画面(Win+Lキー)にすると、カーソル位置が {X=0,Y=0} に固定されてしまいます。
    ロック画面を解除すると、カーソル位置は適切な場所に戻る様です。

    ★開発・動作環境
      Visual Studio 2010/Windows 7

    ★サンプルソース(例はVBにて)
      フォームにボタンとテキストボックスを1つ配置して、ボタンクリックに以下を記述。

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim sp As System.Drawing.Point

            For i As Integer = 0 To 20
                sp = System.Windows.Forms.Cursor.Position
                System.Windows.Forms.Cursor.Position = New System.Drawing.Point(sp.X, sp.Y + 1)
                TextBox1.Text = System.Windows.Forms.Cursor.Position.ToString & vbCrLf & TextBox1.Text
                Application.DoEvents()
                System.Threading.Thread.Sleep(1000)
            Next
        End Sub

    ★実行
      プログラムを実行してボタンをクリックし、Windowsキー+Lキーによりロック画面突入。
      その後、ロック画面を解除。

      <<テキストボックス内の出力結果>>
      {X=1167,Y=819}
      {X=0,Y=0}        <- ロック画面中のカーソル位置
      {X=0,Y=0}        <- ロック画面中のカーソル位置
      {X=0,Y=0}        <- ロック画面中のカーソル位置
      {X=440,Y=359}
      {X=440,Y=358}
      {X=440,Y=356}



    ロック画面中でも、マウスカーソル位置を {X=0,Y=0} 固定ではなく、
    特定の位置に変更したいのですが、どのようにすれば良いかわかりません。

    解決方法、ヒント、またはそれはできないなど、
    どなたかご存知の方がいらっしゃいましたらお教えいただけると助かります。

    よろしくお願いいたします。


    2016年2月23日 6:36

回答

すべての返信

  • Win32APIのSetCursorPosとGetCursorPosでカーソルの位置を設定・取得することができます。

    Public Class Form1
        Structure POINTAPI
            Public X As Integer
            Public Y As Integer
        End Structure
    
        Private Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Integer, ByVal y As Integer) As Integer
        Private Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (ByRef lpPoint As POINTAPI) As Integer
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim point As New POINTAPI()
            For i As Integer = 0 To 20
                GetCursorPos(point)
                SetCursorPos(point.X, point.Y + 1)
                TextBox1.Text = String.Format("{0}, {1}", point.X, point.Y) & vbCrLf & TextBox1.Text
                Application.DoEvents()
                System.Threading.Thread.Sleep(1000)
            Next
        End Sub
    End Class

    2016年2月23日 7:21
  • kenjinote さん。

    返信ありがとうございます。

    >Win32APIのGetCursorPos関数でカーソルの位置を取得することができます。

    やりたいことなのですが、カーソル位置を取得することではなく、

    「ロック画面中にプログラムからカーソル位置を設定」することなのです。

    たとえば、ロック画面中にプログラムから X=1,Y=1にマウスカーソル位置を設定しても、

    その後、カーソル位置を取得すると X=0,Y=0 となってしまいます…。

    2016年2月23日 7:33
  • 温かい日差し さん

    設定を忘れておりました。「はっ!」と気づいたので上記プログラムを修正しております。
    すみませんが、ご確認ください。

    2016年2月23日 7:36
  • kenjinote さん。

    早速のまたまた返信、ありがとうございます。

    修正した頂いたプログラムを試したところ、ロック画面中でのカーソル位置が変更されていました!

    #SetCursorPos()の後に再度 GetCursorPos()で位置を取得してみると。

    ただ、System.Windows.Forms.Cursor.Position.ToString を出力してみると、{X=0,Y=0} なのですね…。

    SetCursorPos/GetCursorPosのWin32APIは、.NET のSystem.Windows.Forms.Cursor.Position の

    設定/取得と同じと思っていたので…。

    参考にしたサイト: http://dobon.net/vb/dotnet/system/cursorposition.html


    2016年2月23日 7:57
  • kenjinote さん。

    度々、すみません。

    修正して頂いたプログラムに手を入れて、SetCursorPos()で設定するカーソル位置を (50, 50 + i) として、

    その後にGetCursorPos()でカーソル位置を取得するように変更してみました。

    プログラムを実行し、ロック画面に突入させたところ、カーソル位置は {X=0, Y=0} ではないのですが、ある固定の値となり、SetCursorPos()の設定は効いていない様でした。

    Win32APIのSetCursorPos()でも、ロック画面中にマウスカーソル位置を設定できていないようです…。


    Public Class Form1
        Structure POINTAPI
            Public X As Integer
            Public Y As Integer
        End Structure
    
        Private Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal x As Integer, ByVal y As Integer) As Integer
        Private Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (ByRef lpPoint As POINTAPI) As Integer
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim point As New POINTAPI()
            For i As Integer = 0 To 20
                SetCursorPos(50, 50 + i)
                GetCursorPos(point)
                TextBox1.Text = String.Format("{0}, {1}", point.X, point.Y) & vbCrLf & TextBox1.Text
                Application.DoEvents()
                System.Threading.Thread.Sleep(1000)
            Next
        End Sub
    End Class

    2016年2月23日 8:27
  • こんにちは。

    http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/Cursor.cs,9b794e9d30341224

    Cursor.Positionですが内部的にはSetCursorPos, GetCursorPosを使用しています。
    推測ですが、ロック中にカーソル位置を更新できないのはWindowsの仕様かもしれません。

    #CodeProjectで類似のQ&Aがありましたので参考までに。
    http://www.codeproject.com/Questions/697510/Cursor-Position-on-lock-screen

    2016年2月23日 8:36
    モデレータ
  • 上記プログラムはWindows10で検証しました。

    Windows10のロック中の画面(Win+L)はランダムで壁紙が表示されますが、
    その画面だとカーソル位置を設定できました。

    Windows7で検証してみたところ設定できていないようですね。。。


    2016年2月23日 8:43
  • Tak1wa さん、kenjinote さん

    大変貴重な情報をありがとうございます。

    できないな~っともやもやしていましたが、これですっきりしました。(できないのなら仕方がないw)

    本当にありがとうございました!

    2016年2月23日 8:52