Windows 8 Windows 8 Metro样式剪贴板异常
我开发了一个应用程序,可以用Windows 8 Windows 8 Metro样式剪贴板异常,windows-8,microsoft-metro,clipboard,Windows 8,Microsoft Metro,Clipboard,我开发了一个应用程序,可以用dispatchermer Tick()方法读取剪贴板数据。 每秒读取剪贴板数据 该应用程序在开发机器中(在调试或松弛模式下)不会引发异常,但是如果我在Win-RT平板设备上发布该应用程序,则在读取剪贴板时会出现异常,但奇怪的是,只有在“快照视图”模式下才会出现异常 在全视图模式下,它可以正常工作 例外情况是: "Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))". 代码
dispatchermer Tick()
方法读取剪贴板数据。
每秒读取剪贴板数据
该应用程序在开发机器中(在调试或松弛模式下)不会引发异常,但是如果我在Win-RT平板设备上发布该应用程序,则在读取剪贴板时会出现异常,但奇怪的是,只有在“快照视图”模式下才会出现异常
在全视图模式下,它可以正常工作
例外情况是:
"Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))".
代码看起来像
private async Task Populate()
{
try
{
var clipboardText = await this.GetTextFromClipboard();
.....
}
catch (Exception ex)
{
this.HandleException("Error occured while reading clipboard: ", ex);
}
}
private async Task<string> GetTextFromClipboard()
{
var dataPackageView = Clipboard.GetContent(); // Exception occurs here!!!
if (dataPackageView.Contains(StandardDataFormats.Text))
{
var clipboardText = await dataPackageView.GetTextAsync();
return clipboardText;
}
return string.Empty;
}
专用异步任务填充()
{
尝试
{
var clipboardText=等待此消息。GetTextFromClipboard();
.....
}
捕获(例外情况除外)
{
this.HandleException(“读取剪贴板时出错:”,ex);
}
}
私有异步任务GetTextFromClipboard()
{
var dataPackageView=Clipboard.GetContent();//此处发生异常!!!
if(dataPackageView.Contains(StandardDataFormats.Text))
{
var clipboardText=await dataPackageView.GetTextAsync();
返回剪贴簿文本;
}
返回字符串。空;
}
这里出了什么问题?为什么只在快照视图模式下发生?我找到了问题的原因。在snapview模式下,将某些内容复制到剪贴板时,应用程序失去了焦点。也就是说,Clipboard.GetContent()只能在前台工作。在调度程序计时器中读取剪贴板数据之前,如何在前台处理应用程序?您不能。不允许应用程序窃取前台。这应该是一种方法。我只需要在快照视图模式下执行此操作。计时器正在读取剪贴板数据。在读取剪贴板数据之前,可能我可以将应用程序放在前台的代码中。可能是setfocus之类的。当你说“应该有办法做到这一点”时,请更具体地说明你的意思。你是说“有办法做到这一点,但我找不到”吗?或者您是说“应该重新设计窗口,以便可以窃取焦点”?请不要使用计时器轮询来监视剪贴板。这一战略注定要失败。使用适当的剪贴板通知API。Windows已经拥有它20多年了。