プロが教える店舗&オフィスのセキュリティ対策術

メールソフトやテキストエディタなどで編集系ボタン(切り取り
貼り付け、コピー、元に戻すなど)のツールボタンがある時
クリップボードとかにデータがなければ貼り付けが使用
できない(Enabled = false)とかになっていたりしますが
これはどこのイベントで制御しているのでしょうか?

DelphiだとTActionList(だったかな?)のようにメニューの
イベントと連動して出来たのですが、C#ではどうすれば
良いのでしょうか?

現状は無理やりタイマーコントロールでクリップボードとか
テキストボックスの選択文字数を監視してツールボタンの
有効/無効を切り替えています。

A 回答 (1件)

無理くりですが、次のような方法でどうでしょうか。


この方法は、Win32 APIのSetClipboardViewerを利用します。

※フォーム上に、クリップボードの状態を知らせるランプ代わりのラジオボタンと、
 クリップボードの内容を消すコマンドボタンがある、という前提です。

//-------------------------------- Code Snippet ---------------------------------
public partial class Form1 : Form
{
private const int WM_DRAWCLIPBOARD = 0x0308; // クリップボードが変更されたときのWindowMessage
private bool initialized; // 初期化済みかどうか

public Form1()
{
InitializeComponent();
SetClipboardViewer(this.Handle);
this.initialized = true;
}

protected override void WndProc(ref Message m)
{

if (initialized && m.Msg == WM_DRAWCLIPBOARD)
{
// クリップボードのデータフォーマット総洗い
if (Clipboard.ContainsData(DataFormats.Bitmap) ||
Clipboard.ContainsData(DataFormats.CommaSeparatedValue) ||
Clipboard.ContainsData(DataFormats.Dib) ||
Clipboard.ContainsData(DataFormats.Dif) ||
Clipboard.ContainsData(DataFormats.EnhancedMetafile) ||
Clipboard.ContainsData(DataFormats.FileDrop) ||
Clipboard.ContainsData(DataFormats.Html) ||
Clipboard.ContainsData(DataFormats.Locale) ||
Clipboard.ContainsData(DataFormats.MetafilePict) ||
Clipboard.ContainsData(DataFormats.OemText) ||
Clipboard.ContainsData(DataFormats.Palette) ||
Clipboard.ContainsData(DataFormats.PenData) ||
Clipboard.ContainsData(DataFormats.Riff) ||
Clipboard.ContainsData(DataFormats.Rtf) ||
Clipboard.ContainsData(DataFormats.Serializable) ||
Clipboard.ContainsData(DataFormats.StringFormat) ||
Clipboard.ContainsData(DataFormats.SymbolicLink) ||
Clipboard.ContainsData(DataFormats.Text) ||
Clipboard.ContainsData(DataFormats.Tiff) ||
Clipboard.ContainsData(DataFormats.UnicodeText) ||
Clipboard.ContainsData(DataFormats.WaveAudio))
{
this.radioButton1.Checked = true;
}
else
{
this.radioButton1.Checked = false;
}
}
base.WndProc(ref m);
}

private void button1_Click(object sender, EventArgs e)
{
Clipboard.Clear();
}

[DllImport("user32.dll")]
static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);

//-------------------------------------------------------------------------------


なお、クリップボードのチェインの後始末はしていないので、ご了承ください。

この回答への補足

えっとクリップボード以外の反応(テキストボックスの文字列が
選択されたらツールバーの切り取り、コピー、削除が使えるように
なったりする)があるのですが、そう言うのはどうすれば良いですか?

ちなみにいろいろサイトを調べてみたのですが良い回答が見つからず
IExtenderProviderを使ってメニューとツールバーのステートメントを
連動させることが出来るようになるらしいのですが・・・。

補足日時:2009/03/17 02:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!