在将包对象(XML)读入ADODB流时VBA阻止键盘输入?

前端之家收集整理的这篇文章主要介绍了在将包对象(XML)读入ADODB流时VBA阻止键盘输入?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个应用程序,它打开并读取以前嵌入PowerPoint演示文稿或Word文档中的 XML文档.为了读取这个对象(xmlFile as Object),我必须这样做:

xmlFile.OLEFormat.DoVerb 1

这将打开包对象,我有另一个子例程,它获取Notepad.exe的打开实例,并将其内容读入ADODB流.

Google文档中提供了此过程的示例:

XML_Test.pptm.

在此过程中,Notepad.exe会在几秒钟内获得焦点,无意中击键可能会导致意外结果或读取XML数据时出错.

我正在寻找两件事之一:

>这是一种防止用户在执行此操作时无意中输入(通过键盘/鼠标/等)的方法.最好不要像下面的MouseKeyboardTest子程序那样控制用户机器.要么,
>将XML数据提取到字符串变量的更好方法.

对于#1:这是我找到的功能,我对它的使用持怀疑态度.我担心对用户系统进行这种控制. ##我可以使用其他任何方法吗?##

Private Declare Function BlockInput Lib "USER32.dll" (ByVal fBlockIt As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Sub MouseKeyboardTest() 'both keyboard and mouse blocked

    BlockInput True ' Turns off Keyboard and Mouse
'   Routine goes here
    Sleep 5000 ' Optional coding
    BlockInput False ' Turns on Keyboard and Mouse

End Sub

对于#2:一些背景,但问题似乎是无法使用除DoVerb 1之外的任何方法可靠地提取嵌入对象.因为我正在处理应用程序(记事本)中未保存的文档,这对我的VBA技能免疫,这似乎是唯一的方法.完整的背景,在这里:

Extracting an OLEObject (XML Document) from PowerPoint VBA

我的理解是,您可以控制XML文件如何嵌入到PowerPoint演示文稿中.在这里,我不太明白为什么你选择将所需的数据作为嵌入对象的内容.

可以肯定的是,获取这些内容的任务不是小菜一碟.实际上,只要没有(简单甚至是中等难度)方法调用QueryInterface并使用来自VBA的IPersist *接口,只有一种方法可以获取嵌入对象的内容.方法涉及以下步骤:

>激活嵌入的对象.你使用了OLEFormat.DoVerb 1.更好的方法调用OLEFormat.Activate,但这与您的特定问题无关.
>使用嵌入对象的编程模型执行有用的操作,如获取内容,保存或暴露的任何内容. Notepad.exe没有公开这样的编程模型,你使用WinAPI这是最好的选择.

不幸的是,您当前的方法至少有两个缺陷:

>您在问题中确定的那个(激活notepad.exe导致用户干扰的可能性).
>如果用户使用默认程序打开notepad.exe以外的.txt文件,则您的方法注定失败.

如果您确实可以控制嵌入对象的创建方式,那么更好的方法是将XML数据存储在Shape对象的某些属性中.我会使用Shape.AlternativeText(非常简单易用;如果你将.pptm导出为HTML或者有一些不同的场景,其中AlternativeText很重要)或者Shape.Tags(这个可能是对语言最正确的任务).

猜你在找的XML相关文章