Получение данных из буфера обмена внутри BackgroundWorker - PullRequest
3 голосов
/ 03 октября 2011

У меня есть фоновый работник, и в методе DoWork у меня есть следующее:

 var clipboardData = Application.Current.Dispatcher.Invoke(new Action(() => { Clipboard.GetData(DataFormats.Serializable); }));

Почему это всегда возвращает ноль, даже если я знаю, что в буфере обмена есть данные в правильном формате?

1 Ответ

6 голосов
/ 03 октября 2011

Попробуйте поместить вызов в поток STA:

object data = null;
Thread t = new Thread(() =>
{
    data = Clipboard.GetData(DataFormats.Serializable);
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
// 'data' should be set here.

Внутри метода с действием "OnFinished":

void GetClipboardData(Action<Object> OnFinished)
{
    Thread t = new Thread(() =>
    {
        object data = Clipboard.GetData(DataFormats.Serializable);
        OnFinished(data);
    });
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
}

Вы бы использовали его так:

GetClipboardData((data) =>
{
    // 'data' is set to the clipboard data here.
});

Если вы хотите показать и скрыть окно, попробуйте следующее:

myWindow.Show();
GetClipboardData((data) =>
{
    // Do something with 'data'.
    myWindow.Close();
});

С ShowDialog():

Thread d = new Thread(() =>
{
    myWindow.ShowDialog();
});
d.SetApartmentState(ApartmentState.STA);
d.Start();
GetClipboardData((data) =>
{
    // 'data' is set to the clipboard data here.
   myWindow.Close();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...