質問者
文字の入力中にマウスカーソルが設定にかかわらず非表示になる現象について

質問
-
http://answers.microsoft.com/thread/b76d1a05-0968-431e-894b-ea67228a1306
初めまして、こちらより質問を移動してきました。
アプリ作成でデバッグしているうちに、文字入力でマウスカーソルが常に非表示になるソフトとならないソフトが同じ環境で存在するということで詳しく調べていくことになりました。
私は文字入力中にマウスカーソルが非表示にならないような設定を常用していますが、その設定一つにしてもアプリ毎に挙動が異なるのが気になりました。
そこで、テキストボックスを一つ配置しただけの非常に単純なアプリ(Windowsのメモ帳のような、WPFを使用していない)で調べてみました。
調査結果は移動前のトピックにも記載されていますが、まとめますと次の通りです。
Common Controls 5.8 (COMCTL32.DLL 5.8系)
文字を入力しても、設定通りに動作する。
Common Controls 6.0 (COMCTL32.DLL 6.0系)
文字を入力すると、設定に関係なく非表示になる。
Rich Text Control
文字を入力すると、設定に関係なく非表示になる。
「Hide cursor while typing」や「Hide pointer while typing」を指定して検索エンジンで検索すると、同様の現象に見舞われている方を多く見かけました。
また、こちらに投稿する際に別のテストを行いました。
テスト用のアプリをデバッガーにアタッチして、カーソルを非表示にする可能性のある2つのAPI(SetCursor、ShowCursor)にブレークポイントを設定しました。
テキストボックスに文字を入力したところ、SetCursor APIでブレークがかかりました。このとき、SetCursorを呼び出したときの引数はNULLとなっていました。
http://msdn.microsoft.com/en-us/library/ms648393.aspx
APIドキュメントを参照すると、SetCursorの引数にNULLを指定するとカーソルは非表示になるという旨が記載されていました。
テキストボックスの文字入力時にSetCursor(NULL)がWindowsの設定を無視して呼ばれているのは仕様なのでしょうか。
すべての返信
-
以下の様なバグが報告されています。
http://connect.microsoft.com/VisualStudio/feedback/details/379342/mouse-vanish
実際にやってみると、「マウスのプロパティ」からの設定値は取得できます。
しかし、次のような結果になります。1.「マウスのプロパティ」で当該値を「FALSE」に設定後、
Ret = SystemParametersInfo(
SPI_SETMOUSEVANISH, 0, &b, SPIF_UPDATEINIFILE );// b=TRUEとしている
は成功し、かつ、直後の
Ret = SystemParametersInfo( SPI_GETMOUSEVANISH, 0, &b, 0 );
の結果は、 bに「TRUE」が戻り(期待通り)、Retは1となります。
この後、あらためて「マウスのプロパティ」で確認すると、
「TRUE」になってます(期待通り)。2.「マウスのプロパティ」で当該値を「TRUE」に設定後、
Ret = SystemParametersInfo(
SPI_SETMOUSEVANISH, 0, &b, SPIF_UPDATEINIFILE );// b=FALSEとしている
とし、直後に
Ret = SystemParametersInfo( SPI_GETMOUSEVANISH, 0, &b, 0 );
とすると、bにはFALSEが戻り(だめじゃん)、Retは1ですね。
ところが、この後、あらためて「マウスのプロパティ」で確認すると、
やっぱり「TRUE」になってます(vv;)。つまりFALSEには設定できないようです。
う~む。信用できない状態ですね(笑)。
「マウスのプロパティ」からはできますので、彼は我々の知らない
特別な方法を使っているのかもしれません。従って、主張されている趣旨である。
「非表示にならないような設定= FALSEに設定する」を
「マウスのプロパティ」からでなく、
Win32SDKのSystemParametersInfo()で行っている(つもりの)場合は
実際には「FALSEに設定はできない」ということになります。次に、たとえ「マウスのプロパティ」からの設定であっても、
ご自身の発言の中にもある通り、3.マウスカーソルの表示/消去は誰でもコントロール可能
な状態であるので、
4.MOUSEのVANISHを気にしたところで、
だれも(「マウスのプロパティ」でさえ)完全なコントロールはできない。と予測できます。以上を勘案すると、
5.ひょっとすると、システムの設定など誰も(標準コントロールでさえ)
気にしていないのかもしれないという、やや残念な結論が導けます。
- 編集済み 仲澤@失業者 2014年3月27日 0:44
-
テキストボックスの文字入力時にSetCursor(NULL)がWindowsの設定を無視して呼ばれているのは仕様なのでしょうか。
「仕様かどうか」の問いに答えられるのは、Microsoft だけです。
フォーラムで聞けるのは、Microsoft が公開している情報の提示、あるいは振る舞いからの推測に過ぎず、「仕様かどうか」の問いに答えることはできません。Microsoft 製品のある振る舞いについて、仕様かどうか、不具合かどうかの答えを得たいのであれば、有償のサポートで聞き出すか、公開されているサポート情報で見つけるかのいずれかになります。
-
以下の様なバグが報告されています。
<URLを張れない為削除>
実際にやってみると、「マウスのプロパティ」からの設定値は取得できます。
しかし、次のような結果になります。1.「マウスのプロパティ」で当該値を「FALSE」に設定後、
Ret = SystemParametersInfo(
SPI_SETMOUSEVANISH, 0, &b, SPIF_UPDATEINIFILE );// b=TRUEとしている
は成功し、かつ、直後の
Ret = SystemParametersInfo( SPI_GETMOUSEVANISH, 0, &b, 0 );
の結果は、 bに「TRUE」が戻り(期待通り)、Retは1となります。
この後、あらためて「マウスのプロパティ」で確認すると、
「TRUE」になってます(期待通り)。2.「マウスのプロパティ」で当該値を「TRUE」に設定後、
Ret = SystemParametersInfo(
SPI_SETMOUSEVANISH, 0, &b, SPIF_UPDATEINIFILE );// b=FALSEとしている
とし、直後に
Ret = SystemParametersInfo( SPI_GETMOUSEVANISH, 0, &b, 0 );
とすると、bにはFALSEが戻り(だめじゃん)、Retは1ですね。
ところが、この後、あらためて「マウスのプロパティ」で確認すると、
やっぱり「TRUE」になってます(vv;)。つまりFALSEには設定できないようです。
う~む。信用できない状態ですね(笑)。
「マウスのプロパティ」からはできますので、彼は我々の知らない
特別な方法を使っているのかもしれません。従って、主張されている趣旨である。
「非表示にならないような設定= FALSEに設定する」を
「マウスのプロパティ」からでなく、
Win32SDKのSystemParametersInfo()で行っている(つもりの)場合は
実際には「FALSEに設定はできない」ということになります。次に、たとえ「マウスのプロパティ」からの設定であっても、
ご自身の発言の中にもある通り、3.マウスカーソルの表示/消去は誰でもコントロール可能
な状態であるので、
4.MOUSEのVANISHを気にしたところで、
だれも(「マウスのプロパティ」でさえ)完全なコントロールはできない。と予測できます。以上を勘案すると、
5.ひょっとすると、システムの設定など誰も(標準コントロールでさえ)
気にしていないのかもしれないという、やや残念な結論が導けます。
うーむ…
・カーソルを非表示にしない設定を使わないユーザーにとっては気にならない
・インストール後の既定値が、非表示にする設定になっているこのような事情で、なかなかこの挙動に気づいて貰えないのではと思っています。
-
テキストボックスの文字入力時にSetCursor(NULL)がWindowsの設定を無視して呼ばれているのは仕様なのでしょうか。
「仕様かどうか」の問いに答えられるのは、Microsoft だけです。
フォーラムで聞けるのは、Microsoft が公開している情報の提示、あるいは振る舞いからの推測に過ぎず、「仕様かどうか」の問いに答えることはできません。Microsoft 製品のある振る舞いについて、仕様かどうか、不具合かどうかの答えを得たいのであれば、有償のサポートで聞き出すか、公開されているサポート情報で見つけるかのいずれかになります。
将来の更新で件名にある現象が解決されるのなら、いっそ払っても良いかなと考えているところです。