cefsharp网页请求js的时候,替换掉整个js文件的代码.

3步搞定CefSharp:让Chromium轻松融入.NET应用! 文章摘要: 🔥 CefSharp:让.NET应用轻松嵌入Chromium的魔法工具! 核心功能:在WinForms/WPF中无缝集成Chromium,支持HTML5/CSS3/JS,实现.NET与Web双向通信。 3步上手:初始化引擎→添加浏览器控件→双向调用,代码示例覆盖WPF/WinForms。 10个实用技巧:动态加载网页、监听加载事件、配置代理、禁用GPU加速等,提升开发效率。 适用场景:现代桌面应用UI开发、混合Web/.NET项目、PWA集成等。 一句话推荐:无需复杂配置,CefSharp让你 阅读详情

### 1. CefSharp 简介

CefSharp 允许 .NET 开发者将 Chromium web 浏览器嵌入到他们的应用中。通过这种方式,开发者可以在网页加载前后执行自定义的 JavaScript 代码。

### 2. 注入 JavaScript

使用 CefSharp,您可以在网页加载之后注入并执行 JavaScript 代码。这可以通过 `ExecuteScriptAsync` 方法实现。

示例:

```csharp
var browser = new ChromiumWebBrowser("http://www.example.com");
browser.FrameLoadEnd += (sender, args) => {
    if (args.Frame.IsMain)
    {
        args.Frame.ExecuteScriptAsync("alert('Hello from CefSharp!');");
    }
};
```

这里,当主框架的加载结束后,会弹出一个带有消息“Hello from CefSharp!”的对话框。

### 3. 替换 JavaScript

如果您想替换网页中的现有 JavaScript 函数或代码,可以使用以下策略:

1. 使用 `ExecuteScriptAsync` 来执行自定义的 JavaScript,这将会覆盖网页中的同名函数。

示例:

假设一个网页中有以下 JavaScript 函数:

```javascript
function showMessage() {
    alert('Original Message');
}
```

您可以这样替换它:

```csharp
browser.FrameLoadEnd += (sender, args) => {
    if (args.Frame.IsMain)
    {
        args.Frame.ExecuteScriptAsync(@"
            function showMessage() {
                alert('Replaced Message from CefSharp!');
            }
        ");
    }
};
```

### 3. 请求url为js的时候,替换整个js文件内容

private void barButtonItemLoad_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs eve)
        {
            if(browser!=null)
            {
                browser.Load(SVC.url);
                return;
            }
            
            //禁止再次加载;
            //barButtonItemLoad.Enabled = false;

            //只有包含了此列表的关键字才hook
            if (true)
            {
                //SVC.listHookUrl.Add("sec");
                SVC.listHookUrl.Add("fireye");

                //SVC.listHookUrl.Add("test");
            }

            //url = "https://www.baidu.com";
            url = "file:///C:/Users/User/Desktop/testjs.html";
            url = "http://localhost/js";
            url = "http://localhost:18080/js";
            url = "http://localhost:9090/";
            url = "https://www.baidu.com";
            url = "https://passport.taobao.com/ac/password_find.htm?spm=a2107.1.0.0.30d111d9oo8f0F&from_site=0&lang=zh_CN&app_name=tbTop&tracelog=signin_main_pass";
            url = "https://ssl.captcha.qq.com/template/wireless_mqq_captcha.html?style=simple&aid=16&uin=3557247785&sid=2858167361258078454&cap_cd=tPg7vp9-AqmbS0Eh4HFqKnsIeEyIIrq4ZZiKEWoswjmcCRoLKi2Z_w**&clientype=1&apptype=2";


            SVC.url = url;
            //SVC.webBeanPath=pathClass.getResultPath(true) + Md5Class.encryptStr(SVC.url) + ".obj";

            //2
            //https://www.cnblogs.com/xuejianxiyang/p/9981398.html;
            //CefSharp F12打开DevTools查看console js和c#方法互相调用
            CefSettings settings = new CefSettings();

            // 设置代理服务器和端口
            //方式1
            //settings.Proxy = new ProxyOptions
            //{
            //    Type = ProxyType.Manual,
            //    HttpProxy = "proxyserver:port",
            //    HttpsProxy = "proxyserver:port"
            //};
            //方式2
            //// 创建一个命令行实例
            //var commandLine = new CefCommandLine();

            //// 设置代理服务器和端口
            //commandLine.AppendSwitch("proxy-server", "proxyserver:port");

            //// 将命令行实例应用到浏览器
            //CefCommandLineExtension.ApplyCommandLine(commandLine);


            //settings.CefCommandLineArgs.Add("--disable-web-security", "1");//关闭同源策略,允许跨域
            //settings.CefCommandLineArgs.Add("disable-web-security", "1");
            settings.CefCommandLineArgs.Add("--disable-web-security", "");

            settings.CefCommandLineArgs.Add("ppapi-flash-version", "18.0.0.209");//PepperFlash\manifest.json中的version
            settings.CefCommandLineArgs.Add("ppapi-flash-path", "PepperFlash\\pepflashplayer.dll");
            settings.CefCommandLineArgs.Add("--enable-system-flash", "1");//使用系统flash

            //模拟手机
            //settings.CefCommandLineArgs.Add("--user-agent", "Mozilla/5.0 (Linux; Android 7.1.1; ATU-TL10 Build/N6F26U; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/52.0.2743.100 Mobile Safari/537.36 V1_AND_SQ_8.1.8_1276_YYB_D QQ/8.1.8.4260 NetType/WIFI WebP/0.4.1 Pixel/1440 StatusBarHeight/85 SimpleUISwitch/0");//

            Cef.Initialize(settings);

            /*以上设置未测试是否可行*/


            browser = new ChromiumWebBrowser(url);
            //browser = new ChromiumWebBrowser();
            //this.Controls.Add(browser);
            this.panelControl1.AddControl(browser);
            browser.Dock = DockStyle.Fill;
            browser.KeyboardHandler = new CEFKeyBoardHander();
            //browser.FrameLoadEnd += Browser_FrameLoadEnd;

            browser.RequestHandler = new MyRequestHandler();
            browser.FrameLoadEnd += (s, e) =>
            {
                //一个页面加载如果有多个iframe会重复加载多次,需自己判断自己的加载的iframe或标记执行一次
                BeginInvoke(new Action(() =>
                {
                    //判断是否是需要获取cookie的页面
                    if (e.Url.Contains(""))
                    {
                        //注册获取cookie回调事件
                        ICookieManager cookieManager = browser.GetCookieManager();
                        CookieVisitor visitor = new CookieVisitor();
                        visitor.SendCookie += SaveCookie;
                        cookieManager.VisitAllCookies(visitor);
                    }

                }));
            };
        }




using CefSharp;
using CefSharp.Handler;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CefBrowser.cef
{
    class MyRequestHandler : RequestHandler
    {
        protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
        {
            //if (request.Url.Contains(".js"))
            //{
            //    //return new MyResourceRequestHandler();
            //}
            ////Trace.WriteLine("url:" + request.Url);
            //SVC.url = request.Url;
            return new MyResourceRequestHandler();
        }

        //protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
        //{
        //    // 这里你可以根据需要检查请求的URL或其他条件
        //    //if (/* 滑块滑到末尾或其他你的条件 */)
        //    //{
        //    //    return true; // 这将取消请求
        //    //}

        //    Trace.WriteLine(request.Url);
        //    return false; // 这将允许请求继续
        //}
    }
}




using CefBrowser.bean;
using CefSharp;
using CefSharp.Handler;
using roc_util_project.folder_file_package;
using roc_util_project.path_package;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CefBrowser.cef
{
    class MyResourceRequestHandler : ResourceRequestHandler
    {
 /// <summary>
        /// 替换JS;
        /// </summary>
        /// <param name="chromiumWebBrowser"></param>
        /// <param name="browser"></param>
        /// <param name="frame"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        protected override IResourceHandler GetResourceHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request)
        {
            //https://g.alicdn.com/AWSC/fireyejs/1.226.0/fireyejs.js
            if (request.Url.EndsWith("fireyejs.js"))
            {
                // 返回本地JS文件内容
                //var bytes = File.ReadAllBytes("path/to/your/localScript.js");

                //return fileClass.readToEnd(pathClass.getResultPath(true)+ @"js\fireyejs.js",Encoding.UTF8);
                //E:\svn\chobits\workspace\js\ast\src
                //return code;
                //fileClass.writeLineResult("flyv2",code);

                //base64 没啥用
                string resource = pathClass.getCurrPath() + @"resource";
                string path = $@"{resource}\js\base64.txt";
                string base64 = null;
                if (File.Exists(path))
                {
                    base64 = fileClass.readToEnd(path);
                }

                //fireyejs
                path = @"E:\svn\chobits\workspace\js\ast\src\fireyejs.js";
                if(!File.Exists(path))
                {
                    path = $@"{resource}\js\fireyejs.js";
                }
                string codeInput = fileClass.readToEnd(path, Encoding.UTF8);//.Replace("[base64String]", base64)

                //roc
                path = @"E:\svn\chobits\workspace\js\ast\src\roc.js";
                if (!File.Exists(path))
                {
                    path = $@"{resource}\js\roc.js";
                }
                string roc = fileClass.readToEnd(path,Encoding.UTF8);

                string temp = fileClass.readToEnd($@"{resource}\js\taobao\i.js", Encoding.UTF8);
                roc = roc.Replace("[roci]", temp.Replace("`", @"\`"));

                temp = fileClass.readToEnd($@"{resource}\js\taobao\fireyejs.js", Encoding.UTF8);
                roc = roc.Replace("[fireyejs]", temp.Replace("`", @"\`"));

                temp = fileClass.readToEnd($@"{resource}\js\taobao\PerformanceEntry.txt", Encoding.UTF8);
                roc = roc.Replace("[entries]", temp.Replace("`", @"\`"));

                //temp = fileClass.readToEnd(@"D:\js\taobao\window.txt", Encoding.UTF8);
                //roc = roc.Replace("[rocwindow]", temp.Replace("`", @"\`"));

                codeInput = roc + codeInput;
                //Trace.WriteLine(codeInput);
                //return codeInput;

                var bytes=Encoding.UTF8.GetBytes(codeInput);
                return ResourceHandler.FromByteArray(bytes, "application/javascript");
            }
            else if(request.Url.Contains("https://t.captcha.qq.com/tdc.js123"))
            {
                string code = @"原始JS";

                //原始JS上面增加自己的js
                string roc = @"
                //simulateSlide('nc_1_n1z', 400,2000);
                window.rocTest=function()
                {
                    function cubicBezier(p1, p2, t) {
                        const u = 1 - t;
                        const tt = t * t;
                        const uu = u * u;
                        const uuu = uu * u;
                        const ttt = tt * t;

                        const x = uuu * 0 + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * 1;
                        const y = uuu * 0 + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * 1;

                        return { x, y };
                    }

                    function simulateSlide(id, offsetX, duration) {
                        //const slider = document.getElementById(id);
                        //console.log('slider',slider);

                        let slider = document.querySelector('.tc-fg-item.tc-slider-normal');
                        //let slider = document.querySelector('.tc-fg-item.tc-slider-normal');

                        const rect = slider.getBoundingClientRect();

                        const x0 = rect.x || rect.left;
                        const y0 = rect.y || rect.top;

                        const controlPoints = {
                            p1: { x: 0.42, y: 0 },
                            p2: { x: 0.58, y: 1 }
                        };

                        let startTime;
                        const stepCount = Math.abs(offsetX);
                        const avgDelay = duration / stepCount;

                        function sendMouseEvent(type, x, y) {
                            const event = new MouseEvent(type, {
                                clientX: x,
                                clientY: y,
                                bubbles: true,
                                cancelable: true,
                                view: window
                            });
                            slider.dispatchEvent(event);
                        }

                        function step(timestamp) {
                            if (!startTime) startTime = timestamp;
                            const elapsed = timestamp - startTime;

                            const t = Math.min(elapsed / duration, 1);
                            const position = cubicBezier(controlPoints.p1, controlPoints.p2, t);

                            const x = x0 + position.x * offsetX;
                            const y = y0 + position.y * offsetX;

                            sendMouseEvent(""mousemove"", x, y);

                            if (t < 1) {
                                const randomDelay = Math.random() * (2 * avgDelay);
                                setTimeout(() => requestAnimationFrame(step), randomDelay);
                            } else {
                                sendMouseEvent(""mouseup"", x, y);
                            }
                        }

                        sendMouseEvent(""mousedown"", x0, y0);
                        requestAnimationFrame(step);
                    }
                    simulateSlide('nc_1_n1z', 400,2000);
                }";

                code = roc +"\r\n"+ code;
                var bytes = Encoding.UTF8.GetBytes(code);
                return ResourceHandler.FromByteArray(bytes, "application/javascript");
            }
            else if (request.Url.Contains("dy-ele.f01bfcf8.js"))
            {
                string code = @"原始JS";

                string roc = @"
                //simulateSlide('nc_1_n1z', 400,2000);
                window.rocTest=function()
                {
                    function cubicBezier(p1, p2, t) {
                        const u = 1 - t;
                        const tt = t * t;
                        const uu = u * u;
                        const uuu = uu * u;
                        const ttt = tt * t;

                        const x = uuu * 0 + 3 * uu * t * p1.x + 3 * u * tt * p2.x + ttt * 1;
                        const y = uuu * 0 + 3 * uu * t * p1.y + 3 * u * tt * p2.y + ttt * 1;

                        return { x, y };
                    }

                    function simulateSlide(id, offsetX, duration) {
                        //const slider = document.getElementById(id);
                        //console.log('slider',slider);

                        let slider = document.querySelector('.tc-fg-item.tc-slider-normal');
                        //let slider = document.querySelector('.tc-fg-item.tc-slider-normal');

                        const rect = slider.getBoundingClientRect();

                        const x0 = rect.x || rect.left;
                        const y0 = rect.y || rect.top;

                        const controlPoints = {
                            p1: { x: 0.42, y: 0 },
                            p2: { x: 0.58, y: 1 }
                        };

                        let startTime;
                        const stepCount = Math.abs(offsetX);
                        const avgDelay = duration / stepCount;

                        function sendMouseEvent(type, x, y) {
                            const event = new MouseEvent(type, {
                                clientX: x,
                                clientY: y,
                                bubbles: true,
                                cancelable: true,
                                view: window
                            });
                            slider.dispatchEvent(event);
                        }

                        function step(timestamp) {
                            if (!startTime) startTime = timestamp;
                            const elapsed = timestamp - startTime;

                            const t = Math.min(elapsed / duration, 1);
                            const position = cubicBezier(controlPoints.p1, controlPoints.p2, t);

                            const x = x0 + position.x * offsetX;
                            const y = y0 + position.y * offsetX;

                            sendMouseEvent(""mousemove"", x, y);

                            if (t < 1) {
                                const randomDelay = Math.random() * (2 * avgDelay);
                                setTimeout(() => requestAnimationFrame(step), randomDelay);
                            } else {
                                sendMouseEvent(""mouseup"", x, y);
                            }
                        }

                        sendMouseEvent(""mousedown"", x0, y0);
                        requestAnimationFrame(step);
                    }
                    simulateSlide('nc_1_n1z', 400,2000);
                }";

                code = roc + "\r\n" + code;
                var bytes = Encoding.UTF8.GetBytes(code);
                return ResourceHandler.FromByteArray(bytes, "application/javascript");
            }


            return base.GetResourceHandler(chromiumWebBrowser, browser, frame, request);
        }



    }
}

WinForms中集成CefSharp:替代WebBrowser控件的现代桌面应用实践 桌面应用嵌入网页功能是后台管理系统和业务工具中的常见需求,而浏览器内核的选择直接决定页面渲染性能与兼容性。传统WebBrowser控件基于IE内核,对现代CSS/JS支持有限,容易出现白屏、卡顿等问题。基于Chromium内核的CefSharp以独立进程方式运行,支持完整Web标准,提供C#与JavaScript双向通信能力,适用于WinForms等桌面框架。其整体打包、离线部署的特征也契合内网与受限环境的工程实践。本文从CefSharp的集成步骤、配置要点、进程管理到性能调优与部署细节,为桌面应用开发者提 阅读详情

相关推荐

替换当前页面的方法 - JavaScript技巧

通过使用DOM操作,我们可以选择目标元素,并将新的元素插入到相同的位置上,从而实现替换效果。以上示例代码可以作为你开始进行页面替换的起点,你可以根据自己的需求进行修改和扩展。其中一个常见的任务是替换当前页面的内容。要替换当前页面的内容,我们需要使用JavaScript中的DOM(文档对象模型)操作。请注意,上述代码只是一个示例,你可以根据自己的需求进行修改和扩展。你可以使用不同的标记和内容来替换页面上的元素。这将从目标元素的父节点中移除目标元素,并将新元素插入到相同的位置上。元素,它将被用作新的标题。

ByteZenith的博客 496

CefSharp 注入js的两种方法

CefSharp注入js的两种方法,可对指定网站进行注入,达到实现业务逻辑,或者优化网站的目的。

且听风吟 2689

cefsharp实现资源替换如网页背景、移除替换标签、html标识、执行javascript脚本学习笔记(含源码说明)

通过自定义的浏览器cefsharp实现某系统的登录,背景图片替换,标题替换,标签移除替换等

无线智能模块 可视DIY智能专家 1135

CefSharp替换WinForm WebBrowser:.NET 4.0实战

在桌面客户端开发中,嵌入式浏览器控件常用于承载现代Web页面。WinForm自带的WebBrowser依赖IE内核,页面兼容性与脚本能力有限;CefSharp则通过ChromiumWebBrowser封装CEF多进程架构,由托管程序集调用libcef.dll等原生运行库,实现Chromium渲染能力。其技术价值在于让旧版.NET Framework 4.0与VS2010工程也能接入现代前端,并支持C#与JavaScript双向通信、导航控制和调试日志。典型场景包括老WinForm项目替换WebBrowser

weixin_31421613的博客 202

CefSharp替换WebBrowser:.NET 4.0老项目嵌入Chrome内核及JS交互实践

在桌面应用开发中,WinForm的WebBrowser控件因默认使用老版本IE内核,长期存在对HTML5、CSS3和现代JavaScript框架支持不足的问题,导致页面渲染错乱、数据可视化组件白屏等痛点。CefSharp作为将Chromium内核封装为C#类库的解决方案,能完整提供当前浏览器级别的标准支持,使老系统无需重写即可接入现代前端技术。本文从基础概念出发,介绍CefSharp的工作原理及其对.NET Framework 4.0等旧环境的兼容性,并结合实际工程经验,说明如何通过C#与JavaScrip

weixin_26805597的博客 254

CefSharp 125 x64 H.264 发布包替换与验证实战

在桌面应用开发中,嵌入浏览器控件播放视频常因编解码器缺失而失败。其原理在于,官方预编译的 CEF 二进制出于授权考虑,默认不包含 H.264/AAC 等专利编解码器,导致视频黑屏或报错。通过替换自定义编译的 libcef.dll 及相关文件,可启用 proprietary codecs,从而支持 H.264 解码。这一技术价值在于实现离线、稳定的视频播放,适用于 WPF/WinForms 等需要内嵌视频的桌面场景。本文围绕 CefSharp 125 x64 H.264 发布包,详细讲解替换步骤、验证流程与常

weixin_28831461的博客 264

ChromiumWebBrowser 与js 交互类

wpf 加载ChromiumWebBrowser 浏览器 与js交互 发消息同信

10BASE-T1S协议中的PLCA机制:实现无碰撞网络传输的关键

本文深入解析了10BASE-T1S协议中的PLCA(物理层冲突避免)机制。作为IEEE 802.3cg标准的关键部分,PLCA通过循环调度与机会传递,从根源上避免了网络碰撞,为工业与汽车等场景提供了确定性的低延迟传输保障,是实现可靠实时通信的核心技术。

weixin_29250403的博客 209

避坑指南:处理A股通达信分时数据转日K线时,你可能会遇到的3个时间戳问题

本文针对量化交易中处理A股通达信分时数据转日K线时的常见时间戳问题,提供了专业解决方案。重点解析了午休时段处理、Pandas重采样参数设置及CSV读取时的日期解析陷阱,帮助开发者避免数据预处理错误,提升策略回测准确性。适用于Python量化交易开发者。

weixin_42549496的博客 287

无人机避障——Mid360+Fast-lio感知建图+Ego-planner运动规划(胎教级教程)

本工作将 Mid360 激光雷达、Fastlio-SLAM 和 Ego-Planner 集成,实现无人机的环境感知、定位建图和运动规划(仿真过程)—— 胎教级教程。

weixin_45390670的博客 1万+

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2143

差分逻辑电平——LVDS、CML、LVPECL、HCSL互连

首先了解差分逻辑电平结构,也包括单端逻辑电平常见的逻辑电平_常用的逻辑电平-优快云博客注:ECL >> PECL >> LVPECL演变而来;QDR(Quad Data Rate):四倍数据倍率本文章只涉及差分逻辑电平:LVDS 、LVPECL、CML (高速)(最常用)在任何给定的系统设计中,必须设计驱动器侧和接收器侧之间的时钟逻辑转换。通过在它们之间增加衰减电阻和偏置电路来将一个差分时钟转换为其他类型的差分逻辑,来衰减摆幅电平并重新偏置共模输入接收器。

weixin_45365488的博客 4万+

华为OD机考双机位C卷 - 文件存储系统的排序(Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 文件存储系统的排序, 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 778

激光焦点动态跟踪技术实战大揭秘:电容式与同轴视觉的巅峰对决

激光焦点动态跟踪技术是保证激光加工质量的关键因素。本文对比评测了电容式和同轴视觉两种主流技术:电容式响应速度快、成本低,适合高速稳定加工环境,但易受电磁干扰;同轴视觉精度高、抗干扰强,适合精密加工和复杂工件,但成本较高且处理速度受限。评测结果表明,企业应根据加工需求、预算和环境选择合适技术。未来该技术将向智能化、多技术融合方向发展,为工业应用提供更优解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 124

11、牛转录组分析的实用生物信息学流程

本文详细介绍了一套实用的牛转录组分析生物信息学流程,涵盖从数据提取、基因组索引生成、读取比对到单样本表达分析及差异表达分析的完整步骤。使用Angus和Brahman牛的RNA-seq数据作为示例,介绍了HTSEQ、featureCounts和StringTie等工具在基因表达计数中的应用,并结合edgeR和limma进行差异表达分析。文中提供了详细的命令行与R代码示例,包含常见问题解答与关键注意事项,帮助研究人员高效、准确地完成转录组数据分析。

ios99的博客 111

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: CefSharp.Core.Runtime.dll找不到指定的模块
下一篇: 淘宝滑块x82y-226流程分析(不涉及逆向)
「已注销」
博客等级 码龄14年 116粉丝 43原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值