无法在FileSystemWatcher的重命名事件中访问剪贴板

时间:2013-05-06 17:06:13

标签: c# .net windows-8 desktop-application clipboard

我在我的main函数中实例化了一个名为'watcher'的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);
    }

此代码在重命名文件时始终显示空文本框。请帮助。

2 个答案:

答案 0 :(得分:3)

必须从STA线程启动

Clipboard访问方法才能正常运行。不幸的是,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);
    }));
}

答案 1 :(得分: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();
     }

希望有所帮助:)