0

メイン関数でインスタンス化された「ウォッチャー」と呼ばれる FileSystemWatcher のオブジェクトがあります。「watcher.renamed」イベント中にクリップボードのテキストを文字列変数に保存しようとしましたが、常に空のデータが返されますか? ブレークポイントを使用して変数の値を確認しましたが、空のままです。

コードは次のとおりです。

private void Form1_Load(object sender, EventArgs e)
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = Application.StartupPath;
        watcher.Filter = Path.GetFileName(Application.StartupPath+ @"\RBsTurn.txt");
        watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
        watcher.EnableRaisingEvents = true;
    }

    void watcher_Renamed(object sender, RenamedEventArgs e)
    {
        string x = Clipboard.GetText();
        MessageBox.Show(x);
    }

このコードは、ファイルの名前が変更されると、常に空のテキスト ボックスを表示します。助けてください。

4

2 に答える 2

3

Clipboardアクセス メソッドが正しく機能するためには、STA スレッドから開始する必要があります。残念ながら、 はFileSystemWatcherそのコールバックをスレッドプール スレッドで実行します。これらはすべて MTA の一部です。そのため、クリップボードにアクセスしようとしても、この例では機能しません。

イベント ハンドラーの実行時に何らかの UI 作業を実行する必要がある場合は、それについてフォーム (または UI の他の部分) に通知する必要があります。Formオブジェクトのメソッドを使用BeginInvoke()して、UI スレッドで実行するメソッドを投稿できます。

void watcher_Renamed(object sender, RenamedEventArgs e)
{
    this.BeginInvoke(new Action(() => {
        string x = Clipboard.GetText();
        MessageBox.Show(x);
    }));
}
于 2013-05-06T17:24:32.213 に答える
0

トリックは、イベント ハンドラーで新しいスレッドを作成し、その STA プロパティを設定することでした

ここにコードがあります

 private void Form1_Load(object sender, EventArgs e)
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = Application.StartupPath;
        watcher.Filter = Path.GetFileName(Application.StartupPath+ @"\RBsTurn.txt");
        watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
        watcher.EnableRaisingEvents = true;
    }

    void watcher_Renamed(object sender, RenamedEventArgs e)
    {
        Thread th = new Thread(() =>
        {
            Clipboard.Clear();
        });

        th.IsBackground = true;
        th.SetApartmentState(ApartmentState.STA);
        th.Start();
     }

それが役に立てば幸い :)

于 2013-05-06T17:30:22.943 に答える