手写Windows文件路径获取小工具

手写Windows文件路径获取小工具

目的

给Windows右键增加功能,右键任何文件(夹)显示复制文件路径的扩展。

效果展示

在这里插入图片描述

实现思路

右键调用,自身会把文件路径传递给被调用文件,被调用文件内只需将路径参数复制到剪贴板即可。

局部关键代码

字符串复制到剪贴板:

static DWORD SetStringToClipboard(LPCWSTR string) {int string_length = lstrlen(string);int memory_size = (string_length + 1) * sizeof(wchar_t);HGLOBAL memory_handle = GlobalAlloc(GMEM_MOVEABLE, memory_size);if (memory_handle == NULL) {return GetLastError();}    DWORD error = CopyStringToMemory(string, string_length, memory_handle);if (error != ERROR_SUCCESS) {GlobalFree(memory_handle);return error;}HANDLE result = SetClipboardData(CF_UNICODETEXT, memory_handle);error = GetLastError();if (result == NULL) {GlobalFree(memory_handle);return error;}return ERROR_SUCCESS;
}

源代码

纯C实现,VS2022 MSVC-64bit 编译

#include <Windows.h>
#include <Shlwapi.h>
#include <strsafe.h>static DWORD SetStringToClipboard(LPCWSTR string);
static DWORD CopyStringToMemory(LPCWSTR string, int copied_length, HGLOBAL memory_handle);int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {int argument_count = 0;LPWSTR* arguments = CommandLineToArgvW(GetCommandLine(), &argument_count);if (argument_count < 3) {return ERROR_INVALID_PARAMETER;}BOOL name_only = FALSE;if (lstrcmp(arguments[1], L"-n") == 0) {name_only = TRUE;}else if (lstrcmp(arguments[1], L"-p") == 0) {name_only = FALSE;}else {return ERROR_INVALID_PARAMETER;}LPWSTR string_to_set = arguments[2];if (name_only) {string_to_set = PathFindFileName(string_to_set);}BOOL is_succeeded = OpenClipboard(NULL);if (!is_succeeded) {return GetLastError();}EmptyClipboard();DWORD error = SetStringToClipboard(string_to_set);CloseClipboard();return error;
}static DWORD SetStringToClipboard(LPCWSTR string) {int string_length = lstrlen(string);int memory_size = (string_length + 1) * sizeof(wchar_t);HGLOBAL memory_handle = GlobalAlloc(GMEM_MOVEABLE, memory_size);if (memory_handle == NULL) {return GetLastError();}    DWORD error = CopyStringToMemory(string, string_length, memory_handle);if (error != ERROR_SUCCESS) {GlobalFree(memory_handle);return error;}HANDLE result = SetClipboardData(CF_UNICODETEXT, memory_handle);error = GetLastError();if (result == NULL) {GlobalFree(memory_handle);return error;}return ERROR_SUCCESS;
}static DWORD CopyStringToMemory(LPCWSTR string, int copied_length, HGLOBAL memory_handle) {LPVOID memory = GlobalLock(memory_handle);if (memory == NULL) {return GetLastError();}HRESULT result = StringCchCopy(memory, copied_length + 1, string);GlobalUnlock(memory_handle);if (FAILED(result)) {return ERROR_OUTOFMEMORY;}return ERROR_SUCCESS;
}

安装与卸载

编译完程序后,需要增加到右键功能栏,即需要修改注册表增加功能。

使用方式:保存为.bat文件后,双击运行。

安装:

这里用bat批处理脚本实现安装:

@echo offset exe_path="%~dp0Release\CopyPath.exe"if not exist %exe_path% (echo %exe_path% not found. echo Please build the solution with release configuration, echo   or modify this script to point to an existent executable file.echo Install failed.goto :end
)set reg_path=HKEY_CURRENT_USER\Software\Classesreg add %reg_path%\*\shell\CopyPath /f /ve /d "Copy path"
reg add %reg_path%\*\shell\CopyPath\command /f /ve /d "%exe_path% -p \"%%1\""
reg add %reg_path%\*\shell\CopyName /f /ve /d "Copy name"
reg add %reg_path%\*\shell\CopyName\command /f /ve /d "%exe_path% -n \"%%1\""reg add %reg_path%\Folder\shell\CopyPath /f /ve /d "Copy path"
reg add %reg_path%\Folder\shell\CopyPath\command /f /ve /d "%exe_path% -p \"%%1\""
reg add %reg_path%\Folder\shell\CopyName /f /ve /d "Copy name"
reg add %reg_path%\Folder\shell\CopyName\command /f /ve /d "%exe_path% -n \"%%1\""echo Install succeeded.:end
pause

注意:exe_path需要设置为编译后exe所在路径,且运行脚本后,exe不可移动!

卸载:

清理增加的注册表项即可。

@echo offset reg_path=HKEY_CURRENT_USER\Software\Classesreg delete %reg_path%\*\shell\CopyPath /f
reg delete %reg_path%\*\shell\CopyName /freg delete %reg_path%\Folder\shell\CopyPath /f
reg delete %reg_path%\Folder\shell\CopyName /fecho Uninstallation completed.

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

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

相关文章

JavaSE面向对象

面向对象&#xff1a; 所谓面向对象它是针对于面向过程来说的&#xff0c;面向过程是在意执行的流程。而面向对象在意的功能。将一系列的过程封装到一个容器中&#xff0c;我们通过操作这个容器即以对象的方式来进行操作就是面向对象。 类&#xff1a; 类是一类事物的总称&a…

个人微信api

简要描述&#xff1a; 退出群聊 请求URL&#xff1a; http://域名地址/quitChatRoom 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/json Authorization&#xff1a;login接口返回 参数&#xff1a; 参数名 必选 类型 …

中国当代最具影响力的人物颜廷利:死神(死亡)并不可怕,可怕的是…

中国当代最具影响力的人物颜廷利&#xff1a;死神&#xff08;死亡&#xff09;并不可怕&#xff0c;可怕的是… 在中国优秀传统文化之中&#xff0c;汉语‘巳’字与‘四’同音&#xff0c;在阿拉伯数字里面&#xff0c;通常用‘4’来表示&#xff1b; 作为汉语‘九’字&#x…

docker(二):Centos安装docker

文章目录 1、安装docker2、启动docker3、验证 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 1、安装docker 下载依赖包 yum -y install gcc yum -y install gcc-c yum install -y yum-utils设置仓库 yum-config-manager --add-repo http://mirrors…

Python面试题【python基础部分1-50】

Python面试题【python基础部分1-50】 Python面试题【python基础部分1-50】 Python面试题【python基础部分1-50】 问题&#xff1a;如何在Python中交换两个变量的值&#xff1f; 答案&#xff1a; a, b b, a问题&#xff1a;Python中的列表和元组有什么区别&#xff1f; 答案&…

KAN 笔记

1 Title KAN: Kolmogorov–Arnold Networks&#xff08;Ziming Liu, Yixuan Wang, Sachin Vaidya, Fabian Ruehle, James Halverson, Marin Soljačić, Thomas Y. Hou, Max Tegmark&#xff09;【2024】 2 Conclusion Inspired by the Kolmogorov-Arnold representat…

5.10.3 使用 Transformer 进行端到端对象检测(DETR)

框架的主要成分称为 DEtection TRansformer 或 DETR&#xff0c;是基于集合的全局损失&#xff0c;它通过二分匹配强制进行独特的预测&#xff0c;以及 Transformer 编码器-解码器架构。 DETR 会推理对象与全局图像上下文的关系&#xff0c;以直接并行输出最终的预测集。 1. …

【Linux】-Linux的实用操作:快捷键与软件安装操作、构建软连接、日期时区的设置[4]

目录 一、各类小技巧&#xff08;快捷键&#xff09; 1、ctrl c 强制停止 2、ctrl d 退出或登出 3、历史命令搜索 4、光标移动快捷键 5、清屏 二、软件安装 1、yum命令 2、apt命令 - 扩展&#xff08;ubuntu&#xff09; 三、systemctl命令 四、软连接 1、ln命令…

【字符函数与字符串函数】

文章目录 一、strlen函数1.strlen函数的使用2.strlen函数的模拟实现(1)计算器办法(2)不创建临时变量计数器(3)指针 二、strcpy函数1、strcpy函数的使用2、strcpy函数的模拟实现 三、strcat函数1、strcat函数的使用2、strcat模拟实现3、字符串自己给自己追加&#xff1f; 四、st…

MySQL报错:You can‘t specify target table ‘user‘ for update in FROM clause

一、问题 执行delete语句时&#xff0c;报错“You can’t specify target table ‘user’ for update in FROM clause” 翻译为“不能先select出同一表中的某些值&#xff0c;再update这个表(在同一语句中)”&#xff0c;即delete的目标表不能在其直接子查询中存在&#xff0…

leetcode876-Middle of the Linked List

题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0c;值为 …

QML进阶(十六) 元素的布局和定位

文章目录 定位器Row定位Column定位Grid定位Flow定位定位器嵌套布局管理器RowyLayoutColumnLayoutGridLayoutQML有三种布局定位的方式分别为定位器(Item Positioner)、布局管理器(Item Layout)、锚定位(anchor)。锚定位在之前的内容中已经介绍过了,主要用于元素之间相对位置的锚…

Electron Forge | 跨平台实战详解

简介 上篇 介绍了 Electron 和 Electron Builder 的基本用法&#xff0c;本篇将介绍更常用也更方便的打包工具&#xff0c;Electron Forge 。 Electron Forge 是一个为 Electron 应用的开发、打包和分发而设计的全功能工具集。它整合了多个底层 Electron 工具到一个统一的命令…

01-单片机商业项目编程,从零搭建低功耗系统设计

一、引言 这是关于《单片机商业编程之从零搭建低功耗系统》的第一篇章&#xff0c;个人善忘&#xff0c;平常项目设计当中的一些思路&#xff0c;以前年轻的时候习惯性的录制成视频&#xff0c;也算是当作是自己的笔记&#xff0c;无奈现在喉咙实在扛不住&#xff0c;因此先尝试…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第一周) - 自然语言处理介绍和线性分类

自然语言处理介绍和线性分类 1. 自然语言处理介绍2. 线性二分类3. 情感分析和基础特征提取 3.1. 情感分析3.2. 特征提取3.3. 文本预处理 4. 学习的基础-梯度下降算法5. 感知机6. 逻辑回归7. 情感分析8. 感知机和逻辑回归 1. 自然语言处理介绍 自然语言处理的目标是什么 能够解…

(2024,KAN,MLP,可训练激活函数,样条函数,分层函数)Kolmogorov–Arnold 网络

KAN: Kolmogorov–Arnold Networks 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. KAN 2.1 KA 表示定理 2.2 KAN 架构 2.3 KAN 的逼近能力和缩放定律 2.4 对于…

国产操作系统下使用dpkg命令管理软件包 _ 统信 _ 麒麟 _ 中科方德

往期好文&#xff1a;国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello&#xff0c;大家好啊&#xff01;在Linux系统中&#xff0c;dpkg是Debian包管理系统的基础命令工具&#xff0c;它允许用户安装、卸载、查询和管理软件包。在国产操作系统如统信UOS和麒麟KOS、中科方…

字节码基础

基本概念 java中的字节码&#xff0c;英文bytecode。是java代码编译后的中间代码格式。JVM需要读取并解析字节码才能执行相应的任务。java字节码是JVM的指令集。JVM加载字节码格式的class文件。校验之后通过JIT编译器转换成本机机器代码执行。 java字节码简介 1、java byteco…

阿里云部署ChatGLM-6B及ptuning微调教程

一、模型部署 1.进入阿里云人工智能平台PAI。 2.申请免费试用。 3.打开交互式建模 PAI-DSW。 4.新建实例。 5.填写配置。 6.实例准备完成后点击打开。 7.打开实例后点击Teminal。 8.在Teminal中依次输入以下命令并执行。 apt-get update apt-get install git-lfs git lfs ins…

SQLite利用事务实现批量插入(提升效率)

在尝试过SQLite批量插入一百万条记录&#xff0c;执行时长高达20多分钟后&#xff0c;就在想一个问题&#xff0c;这样的性能是不可能被广泛应用的&#xff0c;更不可能出现在真实的生产环境中&#xff0c;那么对此应该如何优化一下呢&#xff1f; 首先分析一下批量插入的逻辑 …