« 16進数の表記 | トップページ | カーソルが点滅しない »

2018年1月 7日 (日)

Windows10で、入力画面のカーソルが点滅しない

症状

Windows10のアップデートをおこなったあと、入力画面(ドキュメントウィンドウ)のカーソルの点滅が六秒ほどで止まってしまう。Escキーを押せば点滅するが、六秒するとまた止まる。

原因はWindows10のバグです。説明は、こちら。
Windows 10、バージョン 1709 - マイクロソフト コミュニティ

この症状はQXでは出ますが、NewQXでは出ません。メーリングリストでの araken さんの発言によると「NewQXはカーソルを自前で点滅させるため」だそうです。症状が出るアプリと出ないアプリがあるのは、そのためでしょう。

対処法

OSのバグなので、基本的には、どうにもならないのですが、QXの場合、マクロで強制的にカーソルを点滅させることができます。ただし、このやり方が使えるのはドキュメントウィンドウだけ。検索、置換そのほか、ダイアログに出るカーソルを点滅させることはできません。逆にいうと、ダイアログのカーソルが点滅するようになったら、OSのバグが修正されたと分かります。

自動実行マクロの設定を確認

QXのキー定義ファイル(標準設定では QXWKEY.INI)をひらいて、自動実行マクロの設定状態を確認します。下の二つのうち、どちらかを実行してください。
★ツールバーを右クリックし、「キー定義ファイル編集」を選ぶ
★メニューバーの「ファイル」 → その他 → 各種ファイルの編集 → キー定義ファイル

キー定義ファイルをひらいた状態で、
ツールバーの「検索」 → 一覧 → 関数/見出し一覧
実行すると「セクション一覧」がひらいて、
[PopupMenu]
[MenuBar]
[Key]
[ToolBar]
[ToolBar2]
[ToolBar3]
[StatusBar]
……というようなリストが出ます。そのなかに[Macro]がない場合、カーソルを点滅させる設定は簡単です

設定方法1 [Macro] がない場合

キー定義ファイルに[Macro]セクションがない。または、[Macro]セクションはあるが、中身は空っぽで、なにも設定されていない場合、下の手順で設定してください。

★ 「BlinkCaret.zip」をダウンロードし、解凍(展開)する
「BlinkCaret.zip」をダウンロード

★ 解凍(展開)したフォルダのなかに入っている「BlinkCaret.MAC」をQXのマクロフォルダに移す
   C:\QX\MACRO\BlinkCaret.MAC となります。
   《注》 C:\ の部分は環境によって異なります。

★ QXのキー定義ファイル(標準設定では QXWKEY.INI)をひらき、ファイルの一行めに、

[Macro]
AutoMacro = BlinkCaret.MAC

と入力します。上の文字列をコピーしてそのまま貼りつけてください。

貼りつけたあと、[KeyMenu]セクションとのあいだを一行あけます。
下のように、

[Macro]
AutoMacro = BlinkCaret.MAC

[KeyMenu]

《注》 実際はファイルの一行めでなくてもいいのですが、まちがって、ほかのセクションの途中などに挿入すると、最悪の場合、QXが起動しなくなります。一行めに置けばトラブルはないでしょう。
INIファイルを書きかえたらQXが起動しなくなった

★ キー定義ファイルを上書き保存する

★ QXを終了します。常駐している場合は常駐も終了する
QXの常駐を解除(QXが終了できない)

★ QXをもういちど起動し、なにか文書をひらいて、カーソルが点滅しつづけることを確かめる

《注》 複数のQXを使い分けている場合、それぞれのQXのキー定義ファイルについて、上の設定変更をおこなう必要があります。

設定方法2 [Macro] がある場合

QXのキー定義ファイル(標準設定では QXWKEY.INI)のどこかに、

[Macro]
AutoMacro = QAUTOMAC.MAC

というような記述がある、つまり、AutoMacroに、すでにマクロが設定されている。

この場合、設定はちょっとめんどうです。AutoMacroは一つしか指定できないので、すでに設定されているマクロのなかにBlinkCaret.MACを組みこまなければなりません。

★ 自動実行マクロに指定されたマクロをQXでひらく
ツールバーの「検索」 → 一覧 → 関数/見出し一覧
実行するとプロシージャ一覧が出ます。そのなかにAutoTimerがない場合と、ある場合で、設定が異なります。

★★★ AutoTimerがない場合 ★★★

AutoTimerプロシージャ一がない場合は、AutoMacroに指定しているマクロファイルの頭にBlinkCaret.MACの中身を挿入します。

たとえば、
AutoMacro = QAUTOMAC.MAC
が設定されている場合、

★ BlinkCaret.MACの中身をコピーする

BlinkCaret.MACの中身

dllname USER
cdeclare int ShowCaret(HWND);
cdeclare int HideCaret(HWND);

sub AutoTimer
     if @hwnd<>0 then
         HideCaret(@hwnd)
         ShowCaret(@hwnd)
     end if
end proc

★ QAUTOMAC.MACをQXでひらき、その最初の部分にBlinkCaret.MACの中身を貼りつける

QAUTOMAC.MAC はQXに標準装備されたマクロで、自動実行マクロのサンプルです。このマクロにはAutoTimerプロシージャがありません。

Qautomac

マクロの一行めには、たいていコメントが入っています。アポストロフィで始まり、白い背景で表示される文字列。BlinkCaret.MACの中身は、その下に貼りつけます。

Qautomac_blinkcaret

くりかえしますが、これは仮の例です。実際には、あなたのQXでAutoMacroに指定されているマクロファイルに貼りつけます。

★★★ AutoTimerがある場合 ★★★

AutoMacroに指定されているマクロに、すでにAutoTimerプロシージャがある場合は、
BlinkCaret.MACの中身のうち、

dllname USER
cdeclare int ShowCaret(HWND);
cdeclare int HideCaret(HWND);

の部分だけをマクロの頭に貼りつけます。dllname USER で始まるこれらの文字列はWindows APIを呼び出すための設定で、かならずプロシージャの外側に置きます。

残ったマクロのうち、下の部分を、すでに存在するプロシージャに組みこみます。

     if @hwnd<>0 then
         HideCaret(@hwnd)
         ShowCaret(@hwnd)
     end if

上の説明が理解できない人はメーリングリストで質問してください。あなたが実際に使っているマクロを出してもらえば、どう組みこんだらいいか答えられると思います。

 
QXエディタ入門

 ネット検索では一部しかヒットしません。記事は目次から探してください。
   記事の訂正などの最新情報は、こちら。総合案内(おしらせ)

                  ┏よくある質問
                  ┃QXの設定
                  ┃標準設定のQXを使う
       すべての目次━╋QXを使う
                  ┃マクロ
                  ┃QTClip QGREP どこでもホイール
                  ┗パソコンが苦手なかたへ

   QXエディタ入門からGoogleで
   サイト内検索のコツ

 

|

« 16進数の表記 | トップページ | カーソルが点滅しない »