none
マウスカーソルの変更方法について RRS feed

  • 質問

  • お世話になります。

    現在、VB2005でマウスカーソルを変更するプログラムを作成しているのですが、変更したカーソルを元に戻すことができずに困っております。
    サンプルソースを以下に記します。

        Declare Function LoadCursorFromFile Lib "user32.dll" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Integer 
        Declare Function SetSystemCursor Lib "user32.dll" (ByVal hCur As Integer, ByVal id As id) As Integer
        Private Const IDC_ARROW = 32512                 '標準の矢印
        Private Const IDC_NORMAL = IDC_ARROW

        Dim strCurFile0 As String
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1_Click.Click
            '(1)現在のカーソルファイル(?)を取得
            strCurFile0 = ???? ' ← 不完全

            '(2)ファイル名を使ってカーソルを変更
            Dim strCurFile1 As String = "c:\tmp.cur"
            SetSystemCursor((LoadCursorFromFile(strCurFile1)), IDC_NORMAL) 
        End Sub

        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2_Click.Click
            '(3)カーソルを元に戻す
            SetSystemCursor((LoadCursorFromFile(strCurFile0)), IDC_NORMAL) 
        End Sub


    上記の不完全なソースは、Button1をクリックすると、現在のカーソルファイル名を取得した後、カーソルを変更し、Button2をクリックすると、元のカーソルに戻るというモノです。

    上記のソースでは、変更前のカーソルをレジストリ

    HKEY_CURRENT_USER\Control Panel\Cursors

    から取得しようと考えているのですが、Windowsのデフォルトのカーソルの場合はファイル名がわかりませんし、できればレジストリからファイル名を取得するのは避けたいと考えております。
    現在のカーソルを取得できるのであれば、ファイルという形式にはこだわっておりません。

    どなたか、解決方法をご存じの方がいらっしゃいましたらお教えいただけると助かります。

    また、具体的な解決策ではなくとも、解決のヒントになるようなお知恵を拝借できるだけでも助かります。

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

    2009年10月6日 14:29

回答

すべての返信

  • Cursorクラス を使わないのはなぜでしょうか? ファイル名を渡すコンストラクタもありますし、デフォルトのカーソルとしてCursors.Defaultプロパティ もあります。
    2009年10月6日 15:14
  • 早々のご回答ありがとうございます。

    初歩的な質問ですみませんが、Cursorクラスは、システム共通のカーソルの変更も可能でしょうか?
    当該アプリ(またはコントロール)上でのカーソルの変更は、Cursorクラスでできることは承知しておりますが・・・(当方の勉強不足でしたらすみません)

    Cursorクラスでそれが可能であれば、当方としても申し分ありません。
    Cursorクラスの使用による実現可否だけでもかまいませんので、ご意見いただけると助かります。
    よろしくお願いいたします。
    2009年10月6日 16:55
  • 自アプリケーションにだけでなく、別ウィンドウに対するマウスカーソルも書き換えたいのでしょうか?
    まぁあとは先に提示したCursorsクラスを使うとか。
    2009年10月8日 3:52
  • >自アプリケーションにだけでなく、別ウィンドウに対するマウスカーソルも書き換えたいのでしょうか?
    その通りです。
    自アプリ以外でもカーソルが変更されるようにしたいのです。
    機能としては、「コントロールパネル」の「マウス」の「ポインタ」タブでカーソルを変更する機能と同等のものを考えています。
    (ボタンを押せば自アプリ以外でもカーソルがかわるように…そして、デフォルトの状態にもどせるようにする機能)

    Cursorクラスで、自アプリ以外のウィンドウで変更したカーソルを使用する方法探してみましたが、やはり上手く探すことができません。
    ヒントをいただけると助かります。
    よろしくお願いいたします。
    2009年10月9日 0:15
  • 最初のコメントでCursorクラスとCursorsクラスを挙げていて、次のコメントではCurours クラス(のHandle)ではどうですか、と。
    それでダメなら、コントロールパネル相当を作るのですから、それなりにファイル名の追跡など、責任を負うべきではないでしょうか。
    2009年10月9日 0:31
  • 下記のコードは参考にならないでしょうか?

    http://www.codeproject.com/KB/vb/ChangeSystemCursor.aspx


    私は使用していないのでわかりませんが...
    • 回答としてマーク shigenot 2009年10月13日 23:55
    2009年10月13日 11:52
  • >つねやす様

    ご回答ありがとうございます。
    まさに、ご呈示いただいた内容が当方の知りたかった内容で助かりました。
    ありがとうございました。

    >佐祐理様
    いろいろとご助言ありがとうございました。
    迅速にご回答いただけたので、解決へのの方向性がわかり、大変助かりました。
    未だCursorsクラスの使い方に苦慮しておりますが、勉強になりました。
    ありがとうございました。
    2009年10月13日 23:54
  • そのサンプルですが、
    Dim SavedCursor As Icon
    SavedCursor = Icon.FromHandle(Cursors.Arrow.CopyHandle)
    Dim OldCursor As IntPtr = SavedCursor.Handle
    ってやってますが
    Dim SavedCursor As IntPtr
    SavedCursor = Cursors.Arrow.CopyHandle
    だけでいいんじゃないかな。
    2009年10月14日 0:02