Tag: 自动化

Word Automation:使用C#替换图像

我正在尝试使用c#和word自动化更改word文档中的文本和图像。 我已经让它工作正常,我在下面的代码片段做了类似的事情,但我甚至不知道如何开始替换图像。 任何帮助是极大的赞赏! 奥利弗 using Microsoft.Office.Interop.Word; … private static Application WordApp; private static object missing = System.Reflection.Missing.Value; private static object yes = true; private static object no = false; … object search; object replace; object replaceAll = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll; object filename = SourceFile; object destination = DestinationFile; Document d = WordApp.Documents.Open( ref filename, ref missing, ref […]

如果进程要求用户输入,请以编程方式查找

我如何以编程方式(在C#中)确定,如果另外一个外部应用程序(本机,java,.NET或其他……)当前要求用户输入? 这可以在托管代码中完全完成吗? 我正在寻找的是: static Boolean IsWaitingForUserInput(String processName) { ??? } 通过要求用户输入我的意思是当应用程序要求用户输入一些数据或退出错误消息(modal dialog)并且不再能够执行其正常任务时。 正在等待用户绘制内容的绘图应用程序不在此处。 PS:经过编辑以反映底部的评论并使关注更加清晰,一些评论和答案可能与问题不完全一致。 在评估答案和评论时要考虑到这一点。

“尝试使用模拟在远程计算机上运行PowerShell脚本时,不允许”请求注册表访问“

这是我第一次尝试从C#应用程序执行PowerShell脚本。 我正在使用PowerShell,因为我需要从远程计算机上执行的.exe输出。 我能够使用WMI在远程计算机上运行.exe,但是我无法获得所需的输出。 无论如何,过去一天左右我一直在这里,我已经浏览了网络,并在SO处寻找类似的问题,但似乎无法弄清楚问题。 我正在尝试从远程计算机上的.NET 4.0应用程序运行一个简单的PowerShell命令。 当我以管理员身份运行Visual Studio 2013时,以下代码执行正常: PowerShell ps = PowerShell.Create(); ps.AddScript(@”Invoke-Command {c:\path\to\file.exe /p} -computername “); results = ps.Invoke(); 我得到了预期的结果。 但是,当我作为非管理员运行VS时,代码似乎执行正常(没有例外),但我没有得到任何结果。 环顾四周之后,我添加了如下假冒: using (var impersonator = new Impersonator(“username”, “domain”, “password”)) { PowerShell ps = PowerShell.Create(); ps.AddScript(@”Invoke-Command {c:\path\to\file.exe /p} -computername “); results = ps.Invoke(); } 但是,ps.Invoke方法开始抛出System.Security.SecurityException – “不允许请求的注册表访问”。 这是堆栈跟踪: 在System.Management的System.Management.Automation.ModuleIntrinsics.GetExpandedEnvironmentVariable(String name,EnvironmentVariableTarget target)的System.Environment.GetEnvironmentVariable(String variable,EnvironmentVariableTarget target)上的Microsoft.Win32.RegistryKey.OpenSubKey(String […]

以编程方式获取Win32传统控件的工具提示文本

我想获得win32遗留控件的工具提示文本(不是WPF控件本身支持UI自动化 )。 我做了什么: 给定一个感兴趣的按钮,我有它的AutomationElement ,以及它的边界矩形 我将鼠标移到了这个按钮上(代码中); Thread.Sleep(1500)等待弹出工具提示控件; 枚举Desktop的所有子窗口,并获取子窗口tooltipAutomationElement ,其类型为”Tooltip” ; 从tooltipAutomationElement获取此工具提示的name属性,该属性对应于工具提示字符串。 这实际上是有效的,但惩罚是:我必须sleep(1500)并手动等待工具提示出现(5-20​​个按钮将被扫描工具提示字符串),这与性能要求不符。 预期结果(不确定是否可行) 以编程方式获取按钮的工具提示字符串,而不需要显示工具提示 无需逐个鼠标放在每个按钮上。 更新1 :对于TTN_NEEDTEXT ,MSDN doc似乎不是很清楚,我不知道如何使用C#编程。 可以在此处找到与工具提示控制相关的低级结构/消息的相关链接之一。 更新2 :那些相信这可以通过……完成的人,我会说,说起来容易做起来难。 我欢迎那些尝试过的人,对此发表评论,如果你能提供一些证据来certificate其适用性和功效,我欢迎一些表面上可行的解决方案。 更新3 :如果我们尝试最小化TTM_SETDELAYTIME以使sleep(N)最小化,则在一些实验之后这不起作用。 我们只能在工具提示窗口句柄存在后进行调整。 例如 SendMessage(_tooltipCtrl.Handle, TTM_SETDELAYTIME, _TTDT_INITIAL, 10); //10 ms 更新4 :使用TTM_GETTEXTA消息似乎是一个解决方案,但是,它类似于Update 3,我们需要tooltipCtrl的句柄,只有在创建工具提示后才可用,因为要创建此工具提示,我们没有选择,但将鼠标光标hover在工具上方,这似乎有如上所述的性能问题( Thread.Sleep )。 SendMessage(_tooltipCtrl.Handle, TTM_GETTEXTA, 0, ti); 更新5 :“如何获取工具提示文本”使用InterOp(PInvoke)或Automation UI使用传统方法(鼠标hover在工具窗口上,找到Hwnd句柄,然后获取其文本…)不是这篇文章的关注点。 预期结果: 我们可以提取控件的工具提示字符串(比如一个按钮)而不需要hover在控件上吗? 如果有,怎么样? 更新6 :使用WM_MOUSEHOVER激活工具提示窗口似乎不起作用,我已经使用SendMessage(…)测试了正确的wparam和lparam填充,但静脉。

AutomationElement使用Inspect.exe显示,但在使用UIAutomationCore.dll或System.Windows.Automation时不显示

TL; DR :我做错了导致工作区窗格显示在Inspect Objects中但未显示在我的自定义代码中? 我正在尝试为第三方程序编写一些UI自动化。 我正在使用Windows SDK附带的Inspect.exe ,我已经尝试过System.Windows.Automation和直接COM调用 (使用来自UIA Verify的包装器库)。 Process[] processes = Process.GetProcessesByName(“Redacted Client”); if (processes.Length == 0) throw new Exception(“Could not find \”Redacted Client\” process”); PropertyCondition parentFileCond = new PropertyCondition(AutomationElement.ProcessIdProperty, processes[0].Id); PropertyCondition workspaceCond = new PropertyCondition(AutomationElement.NameProperty, “Workspace”, PropertyConditionFlags.IgnoreCase); PropertyCondition documentCond = new PropertyCondition(AutomationElement.NameProperty, “Untitled3”, PropertyConditionFlags.IgnoreCase); var parentElement = AutomationElement.RootElement.FindFirst(TreeScope.Children, parentFileCond); var workspaceElement = […]

如何在C#中找到正确的用户名后单击数据网格中的按钮

所以这是我的代码,它能够获取datagrid列的标题,并从用户输入中找到匹配的值。 例如,如果输入是“jdoe”,它将查看datagrid中的Username列,并将[value.Key] .Text与value.Value匹配 。 现在问题是每行都有一个具有相同自动化ID的“编辑”按钮。 如何遍历数据网格并能够点击“编辑”按钮,而不管“jdoe”是什么行:这是我到目前为止所拥有的: public static bool Contains(this ListView listView, ObjectInList objectInList) { foreach (ListViewRow row in listView.Rows) { if (DataMatches(row, objectInList)) return true; } return false; } private static bool DataMatches(ListViewRow row, ObjectInList objectInList) { foreach (KeyValuePair value in objectInList.Values) { if (row.Cells[value.Key].Text != value.Value) return false; } return true; } } […]

Firefox中使用WebDriver和C#的不受信任的SSL证书

更新:我升级到Selenium 2.37,但仍然有同样的问题! 最新编辑:定义pref后仍然无法工作(见下文) //some more prefs: profile.SetPreference(“network.http.phishy-userpass-length”, 255); profile.SetPreference(“network.automatic-ntlm-auth.trusted-uris”, _url); profile.SetPreference(“webdriver_assume_untrusted_issuer”, true); profile.SetPreference(“webdriver_accept_untrusted_certs”, true); profile.SetPreference(“trustAllSSLCertificates”, true); 我正在使用FF 25.0.1 Webdriver版本:2.31 我以前从来没有遇到过这个问题,但刚开始运行我的自动化测试用例时,发生的事情就是我得到了SSL认证错误,即使我已经接受并添加为例外但我仍然得到错误,因此我的测试案件失败…… 这是我在构建ff webdriver时添加的内容… FirefoxProfile profile = new FirefoxProfile(); profile.SetPreference(“network.http.phishy-userpass-length”, 255); profile.SetPreference(“network.automatic-ntlm-auth.trusted-uris”, _url); profile.SetPreference(“webdriver_assume_untrusted_issuer”, false); drv = new FirefoxDriver(profile); 屏幕截图。

创建文件快捷方式(.lnk)

我一直在寻找一种在C#中创建文件快捷方式的简单方法,但我只找到了那样做的外部dll。 这实际上是相当令人惊讶的,没有内置的方法来做到这一点.. 无论如何,我知道lnk文件只是带有特定命令和给定路径的文本文件。 我想也许我可以创建一个文本文件(在代码中)将它的文本设置为正确的命令并将其扩展名更改为.lnk我尝试先手动执行此操作,但未能这样做。 有没有办法做这样的事情(或者可能是另一种简单的方法)来创建c#中某个路径的快捷方式? 为了清楚起见,通过快捷方式我的意思是一个.lnk文件,它导致文件 编辑:而文件我指的是我想要的任何文件,而不仅仅是我自己的应用程序的快捷方式 如果它不适合每个场景,我会编辑。 添加以下参考: Microsoft Shell控件和自动化 Windows脚本宿主对象模型 添加此命名空间: using Shell32; using IWshRuntimeLibrary; 接下来似乎工作: var wsh = new IWshShell_Class(); IWshRuntimeLibrary.IWshShortcut shortcut = wsh.CreateShortcut( Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + “\\shorcut2.lnk”) as IWshRuntimeLibrary.IWshShortcut; shortcut.TargetPath = @”C:\Users\Zimin\Desktop\test folder”; shortcut.Save(); 希望它能帮助其他人,感谢您的关注。 另外,如果有一种创建文件的方法,请编写正确的命令,然后将其更改为lnk文件,请告诉我。

如何从C#应用程序自动化Firefox?

从最简单的任务开始,从C#应用程序中捕获Firefox中的URL。 它似乎使用user32.dll Windows API函数将无法正常工作,因为它是在IE中捕获URL的方法。

使用EnvDTE自动化Visual Studio

我使用以下代码成功实例化/自动化Visual Studio: System.Type t = System.Type.GetTypeFromProgID(“VisualStudio.DTE.9.0”); object obj = Activator.CreateInstance(t, true); dte = (DTE)obj; Solution sln = dte.Solution; sln.Open(SolutionFile); System.Threading.Thread.Sleep(1000); //Do stuff with the solution 注意Thread.Sleep(1000)调用? 如果我不包含它,代码会在它准备好之前尝试对实例进行error handling,并且我得到一个exception: the message filter indicated that the application is busy. 而不是等待n秒,有没有办法轮询这个对象准备?