企业网站的设计要点wordpress调用自定义菜单

张小明 2026/1/10 8:45:12
企业网站的设计要点,wordpress调用自定义菜单,wordpress手机站点,主题营销活动创意前言在 C# 开发中常常面临一类棘手问题#xff1a;如何让程序自动操作那些没有开放 API 的 Windows 应用#xff1f;比如批量处理记事本文件、自动化填写老旧桌面软件表单#xff0c;或对封闭系统进行回归测试。传统方法要么依赖第三方接口#xff08;很多软件根本不提供如何让程序自动操作那些没有开放 API 的 Windows 应用比如批量处理记事本文件、自动化填写老旧桌面软件表单或对封闭系统进行回归测试。传统方法要么依赖第三方接口很多软件根本不提供要么靠人工重复点击——效率低、易出错、难维护。其实Windows 早已内置了一套强大的秘密武器UI Automation。可以允许你的 C# 程序像真人一样识别窗口、定位按钮、输入文字、点击保存真正实现所见即所得的自动化。本文将通过一个完整的记事本自动化实战案例带你从零掌握这项被低估却极其实用的技术。正文UI Automation 是微软官方提供的可访问性技术最初为辅助功能设计但因其通用性和稳定性逐渐成为桌面自动化的首选方案。它不依赖应用是否开放接口只要界面元素能被 Windows 识别几乎所有标准 Win32、WPF、UWP 应用都支持就能被程序操控。核心思路将每个 UI 元素如窗口、按钮、文本框视为一个带有属性和模式的对象通过条件筛选找到目标控件再调用其支持的操作如点击、输入、获取文本。整个过程无需图像识别性能高、可靠性强。以下是一个典型的项目配置确保能调用 UI Automation COM 组件Project SdkMicrosoft.NET.Sdk PropertyGroup OutputTypeExe/OutputType TargetFrameworknet8.0/TargetFramework UseWindowsFormstrue/UseWindowsForms /PropertyGroup ItemGroup COMReference IncludeUIAutomationClient WrapperTooltlbimp/WrapperTool Guid944de083-8fb8-45cf-bcb7-c477acb2f897/Guid /COMReference /ItemGroup /Project关键在于封装一套健壮的查找与操作工具。例如ElementFinder类提供了带超时重试的控件查找逻辑避免因界面加载延迟导致失败public staticclassElementFinder { privatestaticreadonly IUIAutomation _automation new CUIAutomation(); public static IUIAutomationElement GetDesktop() { return _automation.GetRootElement(); } publicstatic IUIAutomationElement? FindElementSafely( IUIAutomationElement parent, IUIAutomationCondition condition, TreeScope scope, int timeoutMs 5000) { var endTime DateTime.Now.AddMilliseconds(timeoutMs); while (DateTime.Now endTime) { try { var element parent.FindFirst(scope, condition); if (element ! null) return element; } catch (COMException) { // UI可能正在变化继续重试 } Thread.Sleep(100); } returnnull; } publicstatic IUIAutomationElement? FindFirstByControlType( IUIAutomationElement parent, int controlTypeId, int timeoutMs 3000) { var condition _automation.CreatePropertyCondition( UIA_PropertyIds.UIA_ControlTypePropertyId, controlTypeId); return FindElementSafely(parent, condition, TreeScope.TreeScope_Subtree, timeoutMs); } }对于文本输入尤其在 Windows 11 新版记事本中传统SendKeys可能失效。因此采用更底层的keybd_eventAPI 模拟键盘事件确保中英文、大小写、快捷键都能准确发送public staticclassKeyboardHelper { [DllImport(user32.dll)] private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); [DllImport(user32.dll)] private static extern short VkKeyScan(char ch); privateconstuint KEYEVENTF_KEYUP 0x0002; privateconstbyte VK_CONTROL 0x11; public static void SendText(string text) { foreach (char c in text) { if (c \r) continue; SendChar(c); } } public static void SendChar(char character) { short vkKey VkKeyScan(character); byte virtualKey (byte)(vkKey 0xFF); bool needShift (vkKey 0x0100) ! 0; if (needShift) keybd_event(0x10, 0, 0, UIntPtr.Zero); // Shift down keybd_event(virtualKey, 0, 0, UIntPtr.Zero); // Key down keybd_event(virtualKey, 0, KEYEVENTF_KEYUP, UIntPtr.Zero); // Key up if (needShift) keybd_event(0x10, 0, KEYEVENTF_KEYUP, UIntPtr.Zero); // Shift up Thread.Sleep(10); } public static void SendCtrlS() { keybd_event(VK_CONTROL, 0, 0, UIntPtr.Zero); SendChar(s); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, UIntPtr.Zero); } }主业务逻辑NotepadAutomation整合了打开、输入、保存、关闭全流程并针对不同版本记事本做了兼容处理——例如 Windows 11 使用RichEditD2DPT类名而非传统 Edit 控件public classNotepadAutomation { private Process? _notepadProcess; private IUIAutomationElement? _notepadWindow; public bool RunTest() { try { if (!OpenNotepad()) returnfalse; if (!InputRandomText()) returnfalse; if (!SaveFile()) returnfalse; if (!CloseNotepad()) returnfalse; Console.WriteLine(✅ 自动化任务完成); returntrue; } catch (Exception ex) { Console.WriteLine($❌ 执行失败: {ex.Message}); returnfalse; } finally { CleanUp(); } } private bool InputRandomText() { if (_notepadWindow null) returnfalse; var editControl ElementFinder.FindFirstByControlType( _notepadWindow, UIA_ControlTypeIds.UIA_EditControlTypeId, 2000); if (editControl null) { editControl ElementFinder.FindByClassName(_notepadWindow, RichEditD2DPT, 3000); } if (editControl null) { Console.WriteLine(⚠️ 未找到编辑控件使用直接输入模式); return InputTextDirectlyToWindow(); } editControl.SetFocus(); Thread.Sleep(500); var textLines GenerateRandomTextLines(10); var fullText string.Join(Environment.NewLine, textLines); return TryInputText(editControl, fullText); } private bool SaveFile() { _notepadWindow?.SetFocus(); KeyboardHelper.SendCtrlS(); Thread.Sleep(3000); var desktop ElementFinder.GetDesktop(); var saveDialog FindSaveDialog(desktop); if (saveDialog null) { Console.WriteLine(❌ 未找到保存对话框); returnfalse; } var fileName $AutoTest_{DateTime.Now:yyyyMMddHHmmss}.txt; var fileNameEdit FindFileNameEditBox(saveDialog); if (fileNameEdit ! null !IsSearchBox(fileNameEdit)) { fileNameEdit.SetFocus(); Thread.Sleep(300); KeyboardHelper.SendCtrlA(); KeyboardHelper.SendText(fileName); } var saveButton ElementFinder.FindButton(saveDialog, Save, 2000) ?? ElementFinder.FindByAutomationId(saveDialog, 1, 2000); if (saveButton ! null) { ClickElement(saveButton); Thread.Sleep(2000); var desktopPath Environment.GetFolderPath(Environment.SpecialFolder.Desktop); return File.Exists(Path.Combine(desktopPath, fileName)); } returnfalse; } private bool IsSearchBox(IUIAutomationElement element) { var name element.CurrentName ?? ; var automationId element.CurrentAutomationId ?? ; return name.Contains(Search) || automationId.Contains(Search); } }除了记事本这套方案可广泛应用于办公自动化批量处理 Excel、Word 文档回归测试对无 API 的桌面软件进行功能验证数据采集从老旧工控软件中提取运行状态智能运维定时执行配置备份、日志导出等操作。开发中需注意三大要点一是设置合理超时避免死等二是缓存控件引用减少重复查找三是采用多策略兼容不同应用版本。异常处理也至关重要——当 InvokePattern 失败时可降级为键盘模拟确保流程不中断。总结UI Automation 是解决真实痛点的工程神器。它让 C# 开发摆脱对第三方接口的依赖在封闭系统中也能实现高效自动化。本文提供的代码模板经过实战打磨具备良好的健壮性与扩展性可直接用于工业软件、测试工具或个人效率脚本。掌握这项技能意味着可以拥有了操作任何 Windows 软件的能力——这在自动化日益发展的时代是一项不错的技术能力。关键词C#、UI Automation、#桌面自动化、#Windows、#记事本、#控件查找、#键盘模拟、#COM组件、#工业软件、#自动化测试最后如果你觉得这篇文章对你有帮助不妨点个赞支持一下你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助欢迎加入微信公众号社区与其他热爱技术的同行一起交流心得共同成长作者技术老小子出处mp.weixin.qq.com/s/THTZjf_rzVLmsyBqHZ0AGA声明网络内容仅供学习尊重版权侵权速删歉意致谢- EOF -技术群添加小编微信dotnet999公众号dotnet讲堂
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

安徽建设干部学校网站建设网站需要了解些什么问题

PyTorch-CUDA-v2.6镜像在NeRF神经辐射场训练中的应用 在三维视觉技术飞速发展的今天,如何高效重建真实世界的复杂场景成为工业界和学术界共同关注的焦点。神经辐射场(Neural Radiance Fields, NeRF)作为近年来最具突破性的方法之一&#xff…

张小明 2026/1/6 9:24:35 网站建设

网站开发的毕业设计题目高端网站建设的要求

在数字化转型加速的今天,软件安全已成为产品质量不可分割的组成部分。对于软件测试从业者而言,安全测试不再是小众技能,而是必备的核心能力。本文将从实际测试场景出发,系统梳理七类最常见的安全漏洞特征、检测方法与防御策略&…

张小明 2026/1/6 9:24:02 网站建设

不属于c2c网站的是网站费用怎么做会计分录

终极指南:如何快速掌握ViT-B/32__openai模型完整应用 【免费下载链接】ViT-B-32__openai 项目地址: https://ai.gitcode.com/hf_mirrors/immich-app/ViT-B-32__openai ViT-B/32__openai是基于Vision Transformer架构的先进视觉语言模型,专门用于…

张小明 2026/1/6 9:23:28 网站建设

实训课建设网站步骤网页设计实训报告总结1000字

如何快速优化Windows右键菜单:告别卡顿提升操作效率 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾经在整理文件时,被缓慢的右键…

张小明 2026/1/9 16:23:58 网站建设

什么网站做简历模板网站建设实验原理

毕业论文(设计)题目:基于web的二手书交易平台设计与实现开题报告内容:1 毕业设计(论文)综述 1.1 题目背景随着互联网技术的飞速发展,电子商务已经渗透到人们生活的方方面面,极大地改变了传统的商…

张小明 2026/1/6 9:22:22 网站建设

肥乡企业做网站推广泰安市星际网络科技有限公司

本文最初发布在只抄博客,如需查看最新内容与细节补充,欢迎前往原文链接。 前言 虽说标题写的是 “十年老兵”,但实际算算年头,Kinzu v2 发布至今其实已经有十三、四年了。 当年对赛睿的 RAW 霜冻之蓝心动了好久,但碍于钱包原因只能入手一个最入门的 Kinzu v2 过过瘾。作…

张小明 2026/1/6 9:21:48 网站建设