VS2022C#windows窗体应用程序调用DeepSeek API
目录
一、创建DeepSeek API Key
二、创建窗体应用程序
三、设计窗体
1、控件拖放布局
2、主窗体【Form1】设计
3、多行文本框【tbContent】
4、提交按钮【btnSubmit】
5、单行文字框
四、撰写程序
五、完整代码
六、运行效果
七、其它
一、创建DeepSeek API Key
请参考我前面的一篇文章:Visual Stdio 2022 C#调用DeepSeek API_vs2022接入deepseek-CSDN博客的第一步。
二、创建窗体应用程序
1、打开【Visual Studio 2022】,选择【创建新项目(N)】。

2、按下图所示位置:依次选择【C#】→【Windows】→【桌面】,再选择【Windows窗体应用程序】,然后单击右下角的【下一步(N)】。

3、配置新项目,项目名称可填【DeepSeek】,选择程序保存的位置,然后单击右下角的【下一步(N)】。

4、其他信息。使用默认值,直接单击右下角【创建(C)】。就生成了新的项目。

5、安装依赖包【Newtonsoft.Json】。
【鼠标】在右侧【解决方案资源管理器】上右击【管理NuGet程序包(N)】。【鼠标】在右侧【解决方案资源管理器】上右击【管理NuGet程序包(N)】。

点击【浏览】,在上面的【输入框】中输入【Newtonsoft.Json】全部或部分,选择下面列表中显示的【Newtonsoft.Json】,然后在点击右侧窗口中的【安装】按钮。

三、设计窗体
1、控件拖放布局
整窗体大小,在主窗体上放二个文本框,一个按钮,整体效果大致如下图:

2、主窗体【Form1】设计
【Text】设为“DeepSeek”。

3、多行文本框【tbContent】
【(Name)】设为“tbContent”。【Multiline】选择【True】。其它不变。作用用来显示DeepSeek回复的内容。

4、提交按钮【btnSubmit】
【(Name)】设为”btnSubmit“。【Text】设为”提交“。

【双击】按钮为它绑定一个【Click】即单击事件,代码暂不处理。自动生成的事件名称是【tnSubmit_Click】。

VS2022提示将提示你【命名规则冲突】,然后提示你【显示可能的修补程序】,将会出现【解决名称冲突】提示框,单击执行它。

最后的结果如下图,与上面的区别就是事件名称由【btnSubmit_Click】改成了【BtnSubmit_Click】,首字母由小写改成了大写。

5、单行文字框
名称【(Name)】设为”tbAsk“。方法与前面类似,就不图示了。作用是让用户输入提问词。
四、撰写程序
1、两个函数
特别注意:第三行处要填入你自己完整的API key。
private static async Task<JObject> CallDeepSeekApiAsync(string searchTerm)
{const string apiKey = "sk-9****490"; //此处填你的DeepSeek API key const string apiUrl = "https://api.deepseek.com/v1/chat/completions";using var client = new HttpClient();client.DefaultRequestHeaders.Authorization =new AuthenticationHeaderValue("Bearer", apiKey);var requestBody = new{model = "deepseek-chat",messages = new[]{new { role = "user", content = searchTerm }}};try{var response = await client.PostAsJsonAsync(apiUrl, requestBody);response.EnsureSuccessStatusCode();var responseBody = await response.Content.ReadAsStringAsync();return JObject.Parse(responseBody);}catch (HttpRequestException ex){MessageBox.Show($"请求失败:{ex.StatusCode} - {ex.Message}");return JObject.Parse("");}
}private static string? DisplayResponse(JObject response)
{//Console.WriteLine(response.ToString(Newtonsoft.Json.Formatting.Indented));// 提取并显示主要返回内容var choices = response["choices"];if (choices != null && choices.Type == JTokenType.Array){var firstChoice = choices[0];if (firstChoice != null){var text = firstChoice["message"]?.ToString();if (text != null){JObject key = JObject.Parse(text);var k = key["content"]?.ToString();return k;}}}else{MessageBox.Show("No choices found in the response.");}return null;
}
2、按钮事件代码
private async void BtnSubmit_Click(object sender, EventArgs e)
{string searchTerm = tbAsk.Text; // 替换为你希望搜索的关键词或短语tbContent.Text = "请稍候,DeepSeek推理中......";try{var response = await CallDeepSeekApiAsync(searchTerm);string msg = DisplayResponse(response) ?? "";tbContent.Text = msg;}catch (Exception ex){tbContent.Text = $"An error occurred: {ex.Message}";}
}
注意,VS自动生成的代码名称没有【async】修饰。
3、增加【tbAsk】事件
如果需要提问词支持回车提问,可增加【KeyDown】事件,代码如下:
private void TbAsk_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.Enter){btnSubmit.PerformClick();}}
五、完整代码
using Newtonsoft.Json.Linq;
using System.Net.Http.Headers;
using System.Net.Http.Json;namespace DeepSeek
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private static async Task<JObject> CallDeepSeekApiAsync(string searchTerm){const string apiKey = "sk-9***490"; //此处填你的DeepSeek API key const string apiUrl = "https://api.deepseek.com/v1/chat/completions";using var client = new HttpClient();client.DefaultRequestHeaders.Authorization =new AuthenticationHeaderValue("Bearer", apiKey);var requestBody = new{model = "deepseek-chat",messages = new[]{new { role = "user", content = searchTerm }}};try{var response = await client.PostAsJsonAsync(apiUrl, requestBody);response.EnsureSuccessStatusCode();var responseBody = await response.Content.ReadAsStringAsync();return JObject.Parse(responseBody);}catch (HttpRequestException ex){MessageBox.Show($"请求失败:{ex.StatusCode} - {ex.Message}");return JObject.Parse("");}}private static string? DisplayResponse(JObject response){//Console.WriteLine(response.ToString(Newtonsoft.Json.Formatting.Indented));// 提取并显示主要返回内容var choices = response["choices"];if (choices != null && choices.Type == JTokenType.Array){var firstChoice = choices[0];if (firstChoice != null){var text = firstChoice["message"]?.ToString();if (text != null){JObject key = JObject.Parse(text);var k = key["content"]?.ToString();return k;}}}else{MessageBox.Show("No choices found in the response.");}return null;}private async void BtnSubmit_Click(object sender, EventArgs e){string searchTerm = tbAsk.Text; // 替换为你希望搜索的关键词或短语tbContent.Text = "请稍候,DeepSeek推理中......";try{var response = await CallDeepSeekApiAsync(searchTerm);string msg = DisplayResponse(response) ?? "";tbContent.Text = msg;}catch (Exception ex){tbContent.Text = $"An error occurred: {ex.Message}";}}private void TbAsk_KeyDown(object sender, KeyEventArgs e){if (e.KeyCode == Keys.Enter){btnSubmit.PerformClick();}}}
}
注意:完整代码中,我处理了我使用的【API key】,要填上自己完整的【API key】。
六、运行效果
在【提问框】中输入”你好“,然后回车,或者单击【提交】,后内容多行文本框显示”请稍候,DeepSeek推理中......“。

稍候,将出现如下图所示效果,内容显示框显示出了【DeepSeek】回复的内容。

七、其它
1、完整资源下载请单击https://download.csdn.net/download/liufangshun/90455157。
2、在控制台应用程序中调用DeepSeek API请参考我的博文Visual Stdio 2022 C#调用DeepSeek API_vs2022接入deepseek-CSDN博客,相关资源下载请单击https://download.csdn.net/download/liufangshun/90438698。
相关文章:
VS2022C#windows窗体应用程序调用DeepSeek API
目录 一、创建DeepSeek API Key 二、创建窗体应用程序 三、设计窗体 1、控件拖放布局 2、主窗体【Form1】设计 3、多行文本框【tbContent】 4、提交按钮【btnSubmit】 5、单行文字框 四、撰写程序 五、完整代码 六、运行效果 七、其它 一、创建DeepSeek API Ke…...
kettle插件-高性能插入更新插件Upsert
场景:假如T日需要将a表中T-1日的数据同步到b表。由于某种业务需求a表中已经同步到b表中的数据发生了变化需要重新同步,这个时候就会用到插入更新插件,也就是 说a表中数据重新同步b表,若b表中存在此数据(根据唯一id&am…...
python里调用外部控制台应用程序的方法~
有时候我们需要在python里调用外部控制台应用程序,方法如下: step.1 引用suprocess import subprocess # call an external program in python step.2 比如调用一个叫Audio_status.exe的控制台程序 result subprocess.run(["Au…...
工厂方法模式的C++实现示例
核心思想 工厂方法模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定实例化哪一个类。工厂方法模式将对象的实例化过程推迟到子类,从而使得子类可以根据需要决定创建哪种对象。 **Product:**定义产品的接口…...
本地部署Qwen2.5-VL-7B-Instruct模型
本地部署Qwen2.5-VL-7B-Instruct模型 本地部署Permalink **创建环境** conda create -n qwenvl python3.11 -y# 报错: Solving environment: failedPackagesNotFoundError: The following packages are not available from current channels:# 处理: c…...
【C++学习篇】智能指针
目录 1. 智能指针的使用场景分析 2. RAII和智能指针的设计思路 3. C标准库智能指针的使用 4.shared_ptr和weak_ptr 4.1shared_ptr的循环引用问题 4.2 weak_ptr 1. 智能指针的使用场景分析 下⾯程序中我们可以看到,new了以后,我们也delete了,…...
如何将JAR交由Systemctl管理?
AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 废话不多说,进入正题。下面开始说如何使用 systemctl…...
六足仿生机器人地形自适应步态规划研究
六足仿生机器人地形自适应步态规划研究 第1章 绪论第2章 机器人系统建模第3章 地形感知与建模第4章 自适应步态生成算法第5章 动力学仿真与实验第6章 驱动代码设计与实现源码&文档链接 第1章 绪论 1.1 研究背景与意义 1.2 国内外研究现状 1.2.1 多足机器人步态规划 1.2.2 …...
决策树(Decision Tree)基础知识
目录 一、回忆1、*机器学习的三要素:1)*函数族2)*目标函数2.1)*模型的其他复杂度参数 3)*优化算法 2、*前处理/后处理1)前处理:特征工程2)后处理:模型选择和模型评估 3、…...
【OpenCV C++】以时间命名存图,自动检查存储目录,若不存在自动创建, 按下空格、回车、Q、S自动存图
文章目录 // 保存图像的函数 void saveImage(const cv::Mat& frame) {// 生成唯一文件名auto now = std::chrono::system_clock::...
Excel基础(详细篇):总结易忽视的知识点,有用的细节操作
目录 写在前面基础篇Excel主要功能必会快捷键快捷键整理表LotusExcel的文件类型工作表基本操作表项操作选中与缩放边框线 自动添加边框线格式刷设置斜线表头双/多斜线表头不变形的:双/多斜线表头插入多行、多列单元格/行列的移动冻结窗口 方便查看数据打印的常见问题Excel格式…...
pytest中pytest.ini文件的使用
pytest.ini 是 pytest 测试框架的配置文件,它允许你自定义 pytest 的行为。通过在 pytest.ini 中设置各种选项,可以改变测试用例的发现规则、输出格式、插件行为等。以下详细介绍 pytest.ini 文件的使用。 1. 文件位置 pytest.ini 文件通常位于项目的根目录下,pytest 在运…...
Linux下学【MySQL】中如何实现:多表查询(配sql+实操图+案例巩固 通俗易懂版~)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是MySQL篇中,非常实用性的篇章,相信在实际工作中对于表的查询,很多时候会涉及多表的查询,在多表查询的…...
非平稳时间序列分析(三)——季节模型(SARIMA、STL、Holt-Winters)
此前篇章(平稳序列): 时间序列分析(一)——基础概念篇 时间序列分析(二)——平稳性检验 时间序列分析(三)——白噪声检验 时间序列分析(四)—…...
【web前端开发】CSS--CSS简介及其编写位置(上)
1、CSS简介 (1)CSS的全称为:层叠式样式表(Cascading Style Sheets) (2)CSS也是一种标记语言,用于给HTML结构设置样式,例如:文字大小、颜色、元素宽度等等…...
云原生时代的技术桥梁
在数字化转型的大潮中,企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享,也影响了企业对外部市场变化的响应速度。当前,这一转型过程从IT角度来看,已然迈入云原生时…...
【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分
文章目录 🥧栈的初步理解:🥧易错:如何判断栈满🥧栈满理解🥧栈的基本运算📚栈操作的伪代码逻辑(顺序和链栈)📕顺序栈运算实现:顺序栈的表示&#x…...
雷池WAF的为什么选择基于Docker
Docker 是一种开源的容器化平台,可以帮助开发人员将应用程序及其所有依赖项打包到一个称为容器的独立、可移植的环境中。Docker 的核心概念包括以下几点: 容器:Docker 使用容器来封装应用程序及其依赖项,使其能够在任何环境中都能…...
Ubuntu20.04双系统安装及软件安装(七):Anaconda3
Ubuntu20.04双系统安装及软件安装(七):Anaconda3 打开Anaconda官网,在右侧处填写邮箱(要真实有效!),然后Submit。会出现如图示的Success界面。 进入填写的邮箱,有一封Ana…...
文件上传漏洞:upload-labs靶场11-20
目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 ,发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…...
HTTP协议(20250305)
1. 万维网 WWW(World Wide Web)世界范围内的,联机式的信息储藏所,万维网解决了获取互联网上的数据时需要解决的以下问题: 怎样标识分布在整个互联网上的文档 URL用什么样的协议实现万维网上的各种链接 HTTP怎么使用户能够方便的查看文档数…...
Qt中txt文件输出为PDF格式
main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…...
《大语言模型的原理发展与应用》:此文为AI自动生成
《大语言模型的原理发展与应用》:此文为AI自动生成 一、引言:大语言模型,AI 时代的 “新引擎” 在当今数字化浪潮中,大语言模型宛如一颗璀璨的明星,照亮了人工智能发展的道路,成为推动各领域变革的核心驱…...
FPGA 高速接口Aurora8B/10B 协议详解与仿真
FPGA 高速接口Aurora8B/10B 协议详解与IP仿真 1 摘要 Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可…...
大白话Vue 源码
大白话Vue 源码 整体介绍 Vue 源码就像是一个超厉害的“魔法工具箱”,它能帮咱们轻松地做出各种漂亮又好用的网页。这个工具箱里有好几个关键的“魔法道具”,分别是响应式系统、虚拟 DOM、模板编译、组件系统和生命周期钩子,下面咱一个一个…...
grpc工具使用
工具安装 protoc 访问protoc release,根据系统型号,下载对应版本的protoc工具,并将下载到的可执行文件存放于$path中 安装完成后,可通过protoc --version指令校验是否安装成功 protoc --version # 输出: # libprotoc…...
ESP8266连接网络实时上传数据
要实现这个功能,可以按照以下步骤进行编程。我们将使用Arduino IDE来编写代码,并结合ESP8266的WiFi库、MQTT库以及Web服务器库来实现。 1. 准备工作 硬件:ESP8266开发板、温度传感器(如DS18B20)、显示屏(如OLED)。软件:Arduino IDE、ESP8266库、PubSubClient库(MQTT)…...
【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘
摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…...
定制化开发的WooCommerce独立站商城更安全
定制化开发的WooCommerce独立站商城在安全性、交易风险控制以及整体用户体验方面有显著优势。以下是定制化开发在这些方面的具体表现: 1. 安全性更高 定制化开发允许开发者从底层架构开始设计和优化,确保网站的安全性。以下是具体表现: (1…...
AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增
电网系统覆盖幅员辽阔,每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点,亟需智能化工具的突破性革新。为了满足这一需求,遨游通讯推出AORO P9000 PRO三防平板,以…...
