0

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

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

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 回答