![]() |
1
4
Hans是正确的,Acrobat Reader在托管代码中生成两个子AcroRd32进程,您无法直接访问这些进程。 我已经尝试过了,你有三个可行的选择:
|
![]() |
2
4
我终于有了一个可笑的简单答案。到目前为止,在测试这是工作。 在这个问题困扰了相当长的一段时间之后,我建立了一个复杂的系统,每个自定义控件记录下它们中的哪一个最后有焦点,并使用计时器将焦点翻转回来(当acropdf抓到它时),我重新研究了这个问题,并阅读了大量的答案(寻找最新的解决方案)。收集到的信息帮助我想出了这个主意。 其思想是在加载时禁用(acropdf)控件,如以下示例所示(为清晰起见,代码减少)
然后在计时器上,说1秒钟后。
基本上,这个想法是告诉Windows在允许之前不要让用户使用acropdf控件,因此要求Windows阻止它获得焦点(因为不允许用户进入)。
|
![]() |
3
2
这是一个进程外COM组件,这就是问题所在。完全违反了SetParent()中规定的Windows SDK要求。一旦它的窗口获得焦点,acroread.exe进程中的消息循环将获得所有消息,消息过滤器将无法再看到任何消息。 从技术上讲,可以通过使用SetWindowsHookEx()将DLL注入进程并使用WH\u GETMESSAGE监视消息来修复此问题。但是你不能用C语言写这样的DLL。 少校,我知道。这个项目似乎从来都不缺少它。 |
![]() |
4
2
由于某种原因,Tim的答案,直接禁用AxAcroPDF控件,在我的例子中不起作用。先前选择的文本框上的Leave事件也不会触发。 工作原理是将AxAcroPDF控件嵌套在禁用的GroupBox中。由于我的应用程序的用户只需要查看PDF,而不需要与之交互,因此在设计器中GroupBox的Enabled属性设置为False。 |