AXACROPDF吞噬了所有与密钥相关的事件,一旦焦点,包括快捷方式,钥匙按下等。我添加了一个消息过滤器,并且也不会收到任何与密钥相关的消息。这是一个com组件,这可能是相关的吗?

在控制开始吞咽之前,有什么方法可以抓住这些?

有帮助吗?

解决方案

汉斯是正确的,Acrobat读取器催生了两个Child Acrord32流程,您在托管代码中无法直接访问它们。

我已经对此进行了实验,您有三个可行的选择:

  1. 您可以创建一个 全球系统钩, ,然后查找并滤波 /响应发送给您的孩子Acrord32 Windows的WM_SETFOCUS消息。您可以通过使用包装库来从C#内完成一些操作,例如此处的包装库: http://www.codeproject.com/kb/system/wilsonsystemglobalhooks.aspx

    您还需要确定正确的过程,因为您的应用程序可能有多个实例或Acrord32的其他实例。这是最确定性的解决方案,但是由于您的应用程序现在将要过滤发送到存在的每个窗口的消息,所以我通常不建议这种方法,因为这样,您的程序可能会对系统稳定性产生负面影响。

  2. 找到一个 替代PDF查看控件. 。有关一些商业组件,请参阅此答案: .NET PDF查看器控件 ,或者自己滚动: http://www.codeproject.com/kb/applications/pdfviewercontrol.aspx

  3. 找到一个 可接受的黑客. 。根据您的申请需要的坚固程度,以下代码可能适合(适合我的情况):

    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();
    }
    

其他提示

我终于可能有一个简单的答案。到目前为止,测试这项工作正在起作用。

遇到了相当长的一段时间,并建立了每个自定义控制记录的复杂系统,其中最后一个焦点并使用计时器将焦点倒退(当AcropDF抓住它时),我重新审视了这个问题并阅读了很多答案(寻找最近的解决方案)。收集的信息帮助我提出了这个想法。

这个想法是在加载(如下示例中)时禁用(ACROPDF)控制(为了清楚地减少代码)

axacropdf_this.enabled = false axacropdf_this.src = m_src

然后在计时器上说1秒钟。

axacropdf_this.enabled = false

基本上,这个想法是告诉Windows不要让用户使用AcropDF控件,直到允许为止,因此要求Windows防止其焦点(因为不允许使用用户)。

到目前为止,这就是坚持下去,如果有任何变化,我将编辑此内容。如果它对您不完全有效,那么想法可以指向一个有用的方向。

这是一个未经处理的COM组件,这就是问题所在。完全违反了setParent()中规定的Windows SDK要求。一旦其窗口获得焦点,acroread.exe进程中的消息循环会获取所有消息,您的消息过滤器将无法看到任何消息。

从技术上讲,它可以通过使用setWindowShookex()将DLL注入过程中,并使用wh_getMessage监视消息。但是您不能用C#语言编写这样的DLL。

我知道少校。该程序似乎从来没有缺乏它。

由于某种原因,蒂姆的答案,直接禁用AXACROPDF控件,在我的情况下不起作用。先前选择的文本框上的休假活动也永远不会开火。

正在工作的是将AXACROPDF控件嵌套在禁用组箱的内部。由于我的应用程序的用户只需要查看PDF而不是与之交互,因此GroupBox的启用属性设置为Designer中的false。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top