AxAcroPDF一获得焦点就会吞掉所有与按键相关的事件,包括快捷键、按键等。我添加了消息过滤器,它也没有收到任何与按键相关的消息。它是一个 COM 组件,这可能相关吗?
有什么办法可以在控制者开始吞下它们之前抓住它们吗?
Hans 是正确的,Acrobat Reader 会生成两个子 AcroRd32 进程,您无法从托管代码中直接访问它们。
我已经对此进行了实验,您有三个可行的选择:
-
您可以创建一个全局系统钩子,然后查找并过滤/响应发送到您的子 AcroRd32 窗口的 WM_SETFOCUS 消息。您可以通过使用包装器库在 C# 中完成其中一些任务,如下所示:http://www.codeproject.com/KB/system/WilsonSystemGlobalHooks.aspx
您还需要确定正确的进程,因为您的应用程序可能有多个实例或 AcroRd32 的其他实例。这是最具确定性的解决方案,但由于您的应用程序现在将过滤发送到现有每个窗口的消息,因此我通常不推荐这种方法,因为这样您的程序可能会对系统稳定性产生负面影响。
-
Find an 备用 PDF 查看控件。有关一些商业组件,请参阅此答案:.net PDF 查看器控件,或者自己推出:http://www.codeproject.com/KB/applications/PDFViewerControl.aspx
-
Find an 可接受的黑客攻击。根据您的应用程序需要的健壮程度,如下代码可能合适(它适合我的情况):
DateTime _lastRenav = DateTime.MinValue;
public Form1()
{
InitializeComponent();
listBox1.LostFocus += new EventHandler(listBox1_LostFocus);
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
axAcroPDF1.src = "sample.pdf"; //this will cause adobe to take away the focus
_lastRenav = DateTime.Now;
}
void listBox1_LostFocus(object sender, EventArgs e)
{
//restores focus if it were the result of a listbox navigation
if ((DateTime.Now - _lastRenav).TotalSeconds < 1)
listBox1.Focus();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)