关于C使用Windows API获取系统管理员权限和对文本属性的操作,以及windows API的核心操作

 关于windows系统的操作程序开发,本文介绍一部分重要的文本属性操作,和运行计次器。

获取系统管理员权限

#include <windows.h>
VOID ManagerRun(LPCSTR exe, LPCSTR param, INT nShow)  
{ //注意:会跳出提示。SHELLEXECUTEINFO ShExecInfo; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);  ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ;  ShExecInfo.hwnd = NULL;  ShExecInfo.lpVerb = "runas";  ShExecInfo.lpFile = exe; ShExecInfo.lpParameters = param;   ShExecInfo.lpDirectory = NULL;  ShExecInfo.nShow = nShow;  ShExecInfo.hInstApp = NULL;   BOOL ret = ShellExecuteEx(&ShExecInfo);  CloseHandle(ShExecInfo.hProcess);return;
}
int main(int argc, char *argv[])
{if(argc == 1){ShowWindow(GetConsoleWindow(),SW_HIDE);ManagerRun(argv[0],"2", SW_SHOWNORMAL);return 1;}else if(argc == 2) {/*你的程序主代码在此*/}return 0;
}

 将指定路径文件隐藏属性设置为“True”

#include <windows.h>
#include <stdio.h>
int main() {char *p="D:\\a.txt";// 文件夹路径const char* folderPath = p;// 获取文件夹的属性DWORD attributes = GetFileAttributes(folderPath);if (attributes == INVALID_FILE_ATTRIBUTES) {perror("GetFileAttributes");return 1;}// 添加隐藏属性attributes |= FILE_ATTRIBUTE_HIDDEN;// 设置文件夹的新属性if (!SetFileAttributes(folderPath, attributes)) {perror("SetFileAttributes");return 1;}printf("文件夹属性已设置为隐藏\n"); return 0;
}

将指定路径文件隐藏属性设置为“False”

#include <windows.h>
#include <stdio.h>int main() {// 文件夹路径const char* folderPath = "D:\\a.txt";// 获取文件夹的属性DWORD attributes = GetFileAttributes(folderPath);if (attributes == INVALID_FILE_ATTRIBUTES) {perror("GetFileAttributes");return 1;}// 清除隐藏属性attributes &= ~FILE_ATTRIBUTE_HIDDEN;// 设置文件夹的新属性if (!SetFileAttributes(folderPath, attributes)) {perror("SetFileAttributes");return 1;}printf("文件夹的隐藏属性已取消\n");return 0;
}

文本运行的计次器 

关于指定的C语言程序,我们知道特定的源代码产生特定的exe运行文件,

而且当源程序确定时,通过编译链接得到的exe运行文件,

每次运行该exe文件所产生的效果是恒定的,因为他不具备存储功能,

如果想要控制用户打开指定第几次时,才触发某些操作,则需要一些存储手段。

(放到启动文件夹里,就可以检测从存放如文件以来第n次的开机,可以指定病毒延迟效果)

我们需要向指定恒定存在路径新建一个文本文件,通过每次运行来向其中读写内容,从而控制信息的存储,来实现计次手段。

#include <stdio.h>
#include<windows.h>
#include<conio.h>
int main()
{FILE *p1 = fopen("D:\\a.txt", "a");fputs("1", p1);fclose(p1);char a[2000];FILE *p2 = fopen("D:\\a.txt", "r");fgets(a,2000,p2);int n=0;int num = 0;while(1)
{if(a[n]=='1'){n++;	num++;}else{break;}
}
printf("这是你第%d次打开这个程序\n",num);
printf("按下W键关闭,\n或者按下S键重置次数");while(1)
{if(kbhit)
{if(GetAsyncKeyState('W')){break;}if(GetAsyncKeyState('S')){FILE *p3 = fopen("D:\\a.txt", "w+");fputs("", p3);printf("\n已为你重置运行次数!"); break;}}
}return 0;
}

我在其中设定了最基础的 计次 和 重置次数 功能,感兴趣的话,你可以通过编写,控制该程序在第几次的触发你预先设定好的程序,这个装置可以用来干嘛我就不多说了,配上一点C语言文本指针的内容读写操作,功能自由。

关于windows API 的核心基础,有以下几点

1. 创建和显示窗口

在 Windows 上创建和显示一个窗口是很基础的操作,会用到CreateWindowShowWindow等函数。

#include <windows.h>// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {switch (msg) {case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd, msg, wParam, lParam);}return 0;
}// 主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {static TCHAR szAppName[] = TEXT("HelloWin");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style = CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc = WndProc;wndclass.cbClsExtra = 0;wndclass.cbWndExtra = 0;wndclass.hInstance = hInstance;wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;if (!RegisterClass(&wndclass)) {MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);return 0;}hwnd = CreateWindow(szAppName, TEXT("The Hello Program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,NULL, NULL, hInstance, NULL);ShowWindow(hwnd, iCmdShow);UpdateWindow(hwnd);while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;
}

2. 文件操作

可以使用CreateFileReadFileWriteFile等函数进行文件的创建、读取和写入操作。

#include <windows.h>
#include <stdio.h>int main() {HANDLE hFile;DWORD dwBytesWritten, dwBytesRead;char buffer[] = "Hello, Windows API!";char readBuffer[100];// 创建文件hFile = CreateFile("test.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE) {perror("CreateFile");return 1;}// 写入文件if (!WriteFile(hFile, buffer, sizeof(buffer), &dwBytesWritten, NULL)) {perror("WriteFile");CloseHandle(hFile);return 1;}CloseHandle(hFile);// 打开文件进行读取hFile = CreateFile("test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile == INVALID_HANDLE_VALUE) {perror("CreateFile");return 1;}// 读取文件if (!ReadFile(hFile, readBuffer, sizeof(readBuffer), &dwBytesRead, NULL)) {perror("ReadFile");CloseHandle(hFile);return 1;}CloseHandle(hFile);printf("Read from file: %s\n", readBuffer);return 0;
}

3. 消息框显示

使用MessageBox函数可以显示一个简单的消息框。

#include <windows.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {MessageBox(NULL, TEXT("这是一个消息框示例!"), TEXT("消息框"), MB_OK | MB_ICONINFORMATION);return 0;
}

4. 进程创建

使用CreateProcess函数可以创建一个新的进程。

#include <windows.h>
#include <stdio.h>int main() {STARTUPINFO si;PROCESS_INFORMATION pi;ZeroMemory(&si, sizeof(si));si.cb = sizeof(si);ZeroMemory(&pi, sizeof(pi));// 创建新进程if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {perror("CreateProcess");return 1;}// 等待进程结束WaitForSingleObject(pi.hProcess, INFINITE);// 关闭进程和线程句柄CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;
}

本次内容到此为止,goog night ! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/76627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web 项目实战:构建属于自己的博客系统

目录 项目效果演示 代码 Gitee 地址 1. 准备工作 1.1 建表 1.2 引入 MyBatis-plus 依赖 1.3 配置数据库连接 1.4 项目架构 2. 实体类准备 - pojo 包 2.1 dataobject 包 2.2 request 包 2.3 response 包 2.3.1 统一响应结果类 - Result 2.3.2 用户登录响应类 2.3.3…

从“被动跳闸”到“主动预警”:智慧用电系统守护老旧小区安全

安科瑞顾强 近年来&#xff0c;老旧小区电气火灾事故频发&#xff0c;成为威胁居民生命财产安全的重要隐患。据统计&#xff0c;我国居住场所火灾伤亡人数远超其他场所&#xff0c;仅今年一季度就发生8.3万起住宅火灾&#xff0c;造成503人遇难。这些建筑多建于上世纪&#x…

【深入浅出 Git】:从入门到精通

这篇文章介绍下版本控制器。 【深入浅出 Git】&#xff1a;从入门到精通 Git是什么Git的安装Git的基本操作建立本地仓库配置本地仓库认识工作区、暂存区、版本库的概念添加文件添加文件到暂存区提交文件到版本库提交文件演示 理解.git目录中的文件HEAD指针与暂存区objects对象 …

Mybatis的简单介绍

文章目录 MyBatis 简介 1. MyBatis 核心特点2. MyBatis 核心组件3. MyBatis 基本使用示例(1) 依赖引入&#xff08;Maven&#xff09;(2) 定义 Mapper 接口(3) 定义实体类(4) 在 Service 层调用 4. MyBatis 与 JPA/Hibernate 对比 MyBatis 简介 MyBatis 是一款优秀的 持久层框…

Android Studio 在 Windows 上的完整安装与使用指南

Android Studio 在 Windows 上的完整安装与使用指南—目录 一、Android Studio 简介二、下载与安装1. 下载 Android Studio2. 安装前的依赖准备3. 安装步骤 三、基础使用指南1. 首次启动配置2. 创建第一个项目3. 运行应用4. 核心功能 四、进阶功能配置1. 配置 SDK 和工具2. 自定…

WPF 绑定方式举例

WPF 绑定方式举例 一、如果ItemsControl 控件的ItemsSource要绑定到List类型&#xff0c;可以如下&#xff1a; List<string> Names new List<string>(); Names.Add("aaa"); Names.Add("bbb");<ItemsControl ItemsSource"{Binding …

LangSmith 设置指南

什么是 LangSmith&#xff1f; LangSmith 是 LangChain 团队开发的一个统一开发者平台&#xff0c;用于构建、测试、评估和监控基于大型语言模型&#xff08;LLM&#xff09;的应用程序。它提供了一套工具&#xff0c;帮助开发者更好地理解、调试和改进他们的 LLM 应用。 注册…

手撕TCP内网穿透及配置树莓派

注意&#xff1a; 本文内容于 2025-04-13 15:09:48 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;手撕TCP内网穿透及配置树莓派。感谢您的关注与支持&#xff01; 之前入手了树莓派5&#xff0c;…

Java从入门到“放弃”(精通)之旅——程序逻辑控制④

Java从入门到“放弃”&#xff08;精通&#xff09;之旅&#x1f680;&#xff1a;程序逻辑的完美理解 一、开篇&#xff1a;程序员的"人生选择" 曾经的我&#xff0c;生活就像一段顺序执行的代码&#xff1a; System.out.println("早上8:00起床"); Syste…

学习笔记九——Rust所有权机制

&#x1f980; Rust 所有权机制 &#x1f4da; 目录 什么是值类型和引用类型&#xff1f;值语义和引用语义&#xff1f;什么是所有权&#xff1f;为什么 Rust 需要它&#xff1f;所有权的三大原则&#xff08;修正版&#xff09;移动语义 vs 复制语义&#xff1a;变量赋值到底…

Cocos Creator Shader入门实战(八):Shader实现圆形、椭圆、菱形等头像

引擎&#xff1a;3.8.5 您好&#xff0c;我是鹤九日&#xff01; 回顾 Shader的学习是一条漫长的道路。 理论知识的枯燥无味&#xff0c;让很多人选择了放弃。然而不得不说&#xff1a;任何新知识、新领域的学习&#xff0c;本身面临的都是问题&#xff01; 互联网和AI给了我…

深入理解计算机操作系统(持续更新中...)

文章目录 一、计算机系统漫游1.1信息就是位上下文 一、计算机系统漫游 1.1信息就是位上下文 源程序实际上就是一个由值0和1组成的位&#xff08;又称为比特&#xff09;&#xff0c;八个位被组织成一组&#xff0c;称为字节。每个字节表示程序中的某些文本字符 大部分现代计…

YOLO V8的​​Anchor-Free​​、​​解耦头(Decoupled Head)、损失函数定义(含​​Varifocal Loss)

YOLOv8 的 ​​Anchor-Free​​ 设计摒弃了传统 YOLO 系列中依赖预定义锚框&#xff08;Anchor Boxes&#xff09;的机制&#xff0c;转而直接预测目标的中心点和边界框尺寸。这种设计简化了模型结构&#xff0c;降低了超参数调优的复杂度提升了检测速度和精度。以下是其核心实…

QuarkPi-CA2 RK3588S卡片电脑:6.0Tops NPU+8K视频编解码+接口丰富,高性能嵌入式开发!

QuarkPi-CA2 RK3588S卡片电脑&#xff1a;6.0Tops NPU8K视频编解码接口丰富&#xff0c;高性能嵌入式开发&#xff01; 芯片框架 视频介绍 https://www.bilibili.com/video/BV1btdbYkEjY 开发板介绍 核心升级&#xff0c;产品炸裂 QuarkPi-CA2卡片电脑搭载瑞芯微RK3588S芯片…

【响应式编程】Reactor 常用操作符与使用指南

文章目录 一、创建操作符1. just —— 创建包含指定元素的流2. fromIterable —— 从集合创建 Flux3. empty —— 创建空的 Flux 或 Mono4. fromArray —— 从数组创建 Flux5. fromStream —— 从 Java 8 Stream 创建 Flux6. create —— 使用 FluxSink 手动发射元素7. generat…

从静态绑定驱动模型到现代设备模型 —— 一次驱动架构的进化之旅

&#x1f50d; B站相应的视屏教程&#xff1a; &#x1f4cc; 内核&#xff1a;博文视频 - 从静态绑定驱动模型到现代设备模型 在 Linux 内核的发展历程中&#xff0c;设备驱动结构经历了从"硬编码 手动注册"的早期实现方式&#xff0c;到"设备模型统一管理&qu…

Embedding质量评估、空间塌缩、 Alignment Uniformity

Embedding质量的评估和空间塌缩的解决是自然语言处理&#xff08;NLP&#xff09;和推荐系统领域的关键问题。以下是综合多篇研究的总结&#xff1a; 一、Embedding质量评估方法 基准测试与任务指标 MTEB/C-MTEB&#xff1a;使用多语言或中文的基准测试集&#xff08;如58个数据…

批量给dwg显示略缩图_c#插件实现(com)

如果&#xff0c;cad文件无略缩图&#xff1a; AutoCAD2021版本以上&#xff0c;命令行输入"netload "加载此dll插件&#xff0c;然后输入 “lst”&#xff0c;选择文件夹&#xff0c;即可一键实现给dwg增加略缩图。 效果如下&#xff1a; 附部分代码&#xff1a; …

婴幼儿托育服务与管理实训室:托育未来的基石

在社会对婴幼儿托育服务的重视程度不断加深的当下&#xff0c;专业托育人才的需求急剧增长。婴幼儿托育服务与管理专业作为培育这类人才的关键途径&#xff0c;要求学生熟练掌握婴幼儿身心发展、饮食营养以及卫生保健等基础知识&#xff0c;同时具备全面的照护与管理能力。要实…

(自用)若依生成左树右表

第一步&#xff1a; 在数据库创建树表和单表&#xff1a; SQL命令&#xff1a; 商品表 CREATE TABLE products (product_id INT AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(255) , price DECIMAL(10, 2) , stock INT NOT NULL, category_id INT NOT NULL); 商品分类…