我有一个c#应用程序正在打开word文档,运行.bas宏,并关闭单词。所有这一切都很好。该宏生成2个消息框对话框,其中包含宏的结果。我想将这些消息传达给我的c#应用程序。我怎么能这样做?
这是我的代码:
// Object for missing (or optional) arguments.
object oMissing = System.Reflection.Missing.Value;
// Create an instance of Word, make it visible,
// and open Doc1.doc.
Word.Application oWord = new Word.Application();
oWord.Visible = true;
Word.Documents oDocs = oWord.Documents;
object oFile = @"c:\\Macro.docm";
// Open the file.
Word._Document oDoc = oDocs.Open(ref oFile, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing, ref oMissing, ref oMissing,
ref oMissing, ref oMissing);
// Run the macro.
oWord.GetType().InvokeMember("Run",
System.Reflection.BindingFlags.Default |
System.Reflection.BindingFlags.InvokeMethod,
null, oWord, new Object[] { "MyMacro" });
// Quit Word and clean up.
oDoc.Close(ref oMissing, ref oMissing, ref oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oDoc);
oDoc = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(oDocs);
oDocs = null;
oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(oWord);
oWord = null;
return "all done!";
答案 0 :(得分:3)
我过去用过的解决方案并不适合胆小的人。它基本上涉及使用旧的老式Windows API调用来查找消息框,然后通过其“窗口”(控件)进行枚举,直到找到具有您之后的文本的控件。
如果消息框始终具有相同的标题,您应该能够使用API调用FindWindowEx找到该窗口。一旦你有了它的窗口句柄,你可以使用EnumChildWindows来运行它的控件,直到你找到你想要的那个。您通常可以使用GetWindowText或GetClassName或两者的组合来限定正确的控件。通常,控件的文本应该可以使用GetWindowText,但我不知道MS对这个特定窗口使用了什么控件。
祝你好运!