非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

C#のTextBoxでロック(Enable=false)した際に画面グレーにしない方法

   

C#でテキストボックス(TextBox, RichTextBox)の画面をロックしようとして、Enable=falseにすると画面がグレーになってしまいます。画面色を変えずにロックする方法を紹介します。

 

グレーにしたくない理由として、テキストボックス上で何か処理する際に、画面の状態を変えたくない場合(チラつき防止など)に使いたいのですが、グレーになると結局チラつきが出てしまうのです。

[ad#top-1]

Windows APIを使うしかない

結局のところ、WindowsAPIを使うしか手はないんですね。

コンストラクタの前あたりにこれを書きます。

[System.Runtime.InteropServices.DllImport("user32")]
private static extern int SendMessage(IntPtr hWnd, uint Msg, long wParam, long lParam);
 

 

で、画面ロックする際に以下のようにEnableプロパティの変更と併用すればOKです。

SendMessage(textBox.Handle, 0x000B, 0, 0);
textBox.Enabled = false;
 

 

以下のように画面ロックしても色は変わりません。

 

今回のサンプルのソースコード全文

図で表したもののソースコード全文を載せておきます。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;

class EnableTest{
  static void Main(string[] args){
    Application.Run(new MainWindow(args));
  }
}

class MainWindow : Form{
  private RichTextBox textBox;

  //ウィンドウの再描画を無効
  [System.Runtime.InteropServices.DllImport("user32")]
  private static extern int SendMessage(IntPtr hWnd, uint Msg, long wParam, long lParam);

  public MainWindow(string[] args){
    this.StartPosition = FormStartPosition.CenterScreen;
    this.Width = 600;
    this.Height =400;
    this.Text = "テキストボックステスト";

    textBox = new RichTextBox(){
      Dock = DockStyle.Fill,
      Font = new Font("MS ゴシック", 18),
      Parent=this,
    };
    textBox.DoubleClick += new EventHandler(DoubleClicked);
  }

  private void DoubleClicked(object sender, EventArgs e) {
    SendMessage(textBox.Handle, 0x000B, 0, 0);
    textBox.Enabled = false;
  }
}
 

 

[ad#ad-1]

スポンサーリンク

 - C#応用編