手写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.hqwc.cn/news/691117.html

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

相关文章

linux下的进程通信

进程通信 进程为什么需要通信呢&#xff1f;进程通信的技术背景进程通信本质 进程通信分类管道匿名管道pipe匿名管道原理管道特点 命名管道创建命名管道命名管道原理 System V IPC管道与 System V的区别共享内存函数ftok()shmget() shmat()shmdt()shmctl()删除共享内存System V…

linux系统(ubuntu)调用科大讯飞SDK实现语音识别

1. 科大讯飞官网 登录注册实名制 2. 点击控制台&#xff0c;创建应用 点击左侧的语音听写&#xff0c;右边下滑选择Linux&#xff0c;点击下载 选择Linux平台&#xff0c;普通版本&#xff0c;语音听写&#xff0c;SDK下载 此时将得到一个压缩包&#xff0c;选择的功能不…

【漏洞复现】泛微OA E-Cology portalTsLogin文件读取漏洞

漏洞描述&#xff1a; 泛微E-Cology是一款面向中大型组织的数字化办公产品&#xff0c;它基于全新的设计理念和管理思想&#xff0c;旨在为中大型组织创建一个全新的高效协同办公环境。泛微OA E-Cology portalTsLogin存在任意文件读取漏洞&#xff0c;允许未经授权的用户读取服…

【经验分享】图片自适应窗口大小css;CSS实现背景图片全屏铺满自适应的方式

目录 设置背景颜色和边距 设置背景图片 调整背景图片尺寸和位置 完整代码 使用效果如下&#xff08;展示&#xff09; 网页版图片效果展示 手机版图片效果展示 如何使用 CSS 创建网页背景效果 在网页设计中&#xff0c;背景是一个重要的视觉元素&#xff0c;它可以为网…

SEO之为什么研究关键词(一)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议 新手上云 初做网站的人很容易犯的最大错误之一是&#xff0c;脑袋一拍就贸然进入某个领域&#xff0c;跳过竞争研究&#xff0c;没规划好目标关键词就开始做网站。这样做…

Jmeter中线程组介绍

1.线程数的意义 Jmeter采用了线程来模拟用户&#xff0c;即1个线程代表1个用户&#xff0c;线程可以简单理解为计算机处理任务时的一个具体执行人。 一个任务可以由多个人&#xff08;线程&#xff09;共同完成&#xff0c;也可以由一个人&#xff08;线程&#xff09;来完成&a…

美股市场恒生指数冲刺19000点关口 地产股大涨

查查配5月10日电(中新财经记者 谢艺观)5月10日,港股现强势行情,恒生指数盘中一度冲至18993.28点,距离19000点关口仅一步之遥。 美港通证券以其专业的服务和较低的管理费用在市场中受到不少关注。该平台提供了实盘交易、止盈止损、仓位控制等功能,旨在为投资者提供更为全面的投…

C# 统计代码运行时长

using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespace Sci {/// <summary>/// 统计代码…

如何在计算机上安装两个系统并引导?这里有详细步骤

序言 大多数计算机附带一个操作系统&#xff0c;但你可以在一台电脑上安装多个操作系统。安装两个操作系统&#xff0c;并在启动时在它们之间进行选择。 谷歌和微软终止了英特尔的双启动Windows和Android PC计划&#xff0c;但你可以在安装Windows 7的同时安装Windows 8.1&am…

673. 最长递增子序列的个数(Leetcode)

文章目录 前言一、题目描述二、解题步骤1.小demo介绍2.动态规划1.状态表示2.状态转移方程3.初始化4.填表顺序5.返回值 三、代码编写总结 前言 在本篇文章中&#xff0c;我们将会讲到leetcode中673. 最长递增子序列的个数&#xff0c;我们将会用动态规划方式解决这道问题&#…

Star-CCM+绘制网格-全局网格定义(网格类型选择、薄体网格、网格重置)

前言 绘制网格是有限体积法仿真中必不可少的环节。目前Star-CCM+新版本(2304版)导入面网格只可以导入到部件中。网格类型也只能在操作中完成。零部件导入部件后,选中参与计算的全部部件→右键选择“将部件分配给区域”。此处需要注意的是,只有分配给区域后的部件才能进行网…

HNCTF-PWN

1.ez_pwn 直接看危险函数&#xff0c;不能溢出&#xff0c;只能覆盖ebp。 后面紧接的又是leave,ret 很明显是栈迁移&#xff0c;通过printf打印出ebp&#xff0c;通过偏移计算出栈地址。 通过gdb调试&#xff0c;偏移是0x38 以下是payload&#xff1a; from pwn import * #i…