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

news2024/9/9 1:22:39

手写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 off

set 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\Classes

reg 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 off

set reg_path=HKEY_CURRENT_USER\Software\Classes

reg delete %reg_path%\*\shell\CopyPath /f
reg delete %reg_path%\*\shell\CopyName /f

reg delete %reg_path%\Folder\shell\CopyPath /f
reg delete %reg_path%\Folder\shell\CopyName /f

echo Uninstallation completed.

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

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

相关文章

【江科大STM32学习笔记】新建工程

1.建立工程文件夹&#xff0c;Keil中新建工程&#xff0c;选择型号 2.工程文件夹里建立Start、Library、User等文件夹&#xff0c;复制固件库里面的文件到工程文件夹 为添加工程文件准备&#xff0c;建文件夹是因为文件比较多需要分类管理&#xff0c;需要用到的文件一定要复…

day09-常用API异常

1.时间日期类 1.1 Date类&#xff08;应用&#xff09; 计算机中时间原点 1970年1月1日 00:00:00 时间换算单位 1秒 1000毫秒 Date类概述 Date 代表了一个特定的时间&#xff0c;精确到毫秒 Date类构造方法 方法名说明public Date()分配一个 Date对象&#xff0c;并初始化…

【动态规划】子序列问题I|最长递增子序列|摆动序列|最长递增子序列的个数|最长数对链

一、最长递增子序列 300. 最长递增子序列 算法原理&#xff1a; &#x1f4a1;细节&#xff1a; 1.注意子序列和子数组的区别&#xff1a; (1)子序列&#xff1a;要求顺序是固定的&#xff08;要求没那么高&#xff0c;所以子序列就多一些&#xff09; (2)子数组&#xff1a;要…

Python从0到POC编写-魔法方法

name __name__ 是系统定义的内部函数&#xff0c; 它的作用是识别模块。 通常我们看到这样一句话&#xff1a; if __name__ __main____name__ 的值有两种情况&#xff0c;那么挨个来说下。 如果模块是被直接执行的 &#xff0c;那么 __name__ 的值 为 __main__ 例如&…

搭建 IIS + asp +access 网站

搭建 IIS asp access 网站 一、什么是 asp二、asp 的组成三、asp 说明四、什么是access五、搭建环境六、问题一七、问题二八、网站展示九、IIS 页面展示十、IIS 功能展示 欢迎关注公总号【云边小网安】 一、什么是 asp asp&#xff1a;即 Active Server Pages&#xff0c;是…

PullTube for Mac:视频下载,一键搞定

还在为找不到想看的视频而烦恼吗&#xff1f;PullTube for Mac&#xff0c;让您的视频下载之旅变得更加轻松&#xff01;支持从多个主流视频网站下载视频&#xff0c;提供多种格式和质量选项&#xff0c;满足您的不同需求。简单易用的界面设计&#xff0c;让您轻松上手&#xf…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第6章 安装Samba

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

MongoDB安装及接入springboot

环境&#xff1a;windows、jdk8、springboot2 1.MongoDB概述 MongoDB是一个开源、高性能、无模式&#xff08;模式自由&#xff09;的文档&#xff08;Bson&#xff09;型数据库&#xff1b;其特点如下&#xff1a; 模式自由 ---- 不需要提前创建表 直接放数据就可以 支持高并…

TriCore:Interrupt

今天简单总结下 TriCore 的中断路由模块。 名词缩写 缩写全程说明IRInterrupt Router SRService Request 包括&#xff1a; 1. External Resource 2. Internal Resource 3.SW&#xff08;Software&#xff09; SPService Privoder 包括&#xff1a; 1. CPU 2. DMA SRNServic…

Unity2D 模拟手柄实现玩家移动

1&#xff0c;创建控制器UI 2&#xff0c;挂载脚本 3&#xff0c;脚本编写 基本要素 [Tooltip("玩家游戏体")]public Rigidbody2D player;[Tooltip("玩家速度")]public float speed 1f;[Tooltip("玩家动画")]public Animator animator;public …

本地运行.net项目

有时候需要我们自己做一个.net的课设项目&#xff0c;但是我们有了代码后却不知道怎么运行。我们0基础来学习一下如何运行一个.net项目 1.安装visual studio 2022 不用安装老版本&#xff0c;新版就可以。安装好了2022版本&#xff0c;这是一个支持web的IDE&#xff0c;我们可…

具有CMOS输出,高速响应特点的新型汽车级晶振SG2520CAA

爱普生推出的汽车级晶振SG2520CAA。SG2520CAA是一款CMOS输出的&#xff0c;具有高响应速度的2520封装汽车级晶振&#xff0c;具有低电流消耗&#xff0c;1.6 V至3.63 V的宽工作电压&#xff0c;以及-40C至85C的宽工作温度范围&#xff0c;此外还可提供高达125C的工作温度。符合…

vue3使用setup模式的store报错

** setup store模式 $reset方法报错 ** 顾名思义就是 使用store 使用的是setup 语法模式 不能执行$reset 方法 解决方式&#xff1a; // main.ts import { createPinia } from pinia const pinia createPinia() pinia.use(({ store }) > {const initialState JSON.pars…

算法学习系列(六十):区间DP

目录 引言区间合并模板一、石子合并二、环形石子合并三、能量项链 引言 关于这个区间 D P DP DP &#xff0c;其实是有套路和模板的&#xff0c;题型的话也是变化不多&#xff0c;感觉就那几种&#xff0c;只不过有些题会用到高精度或者是要记录方案&#xff0c;所以整体来说…

SpringSecurity安全过滤器工作原理

前面通过三篇文章&#xff0c;从底层代码的角度分析了SpringSecurity的初始化过程。 接下来我们就要具体看一下&#xff0c;Spring Security的安全过滤器初始化、装配好之后&#xff0c;到底是怎么工作的。 还是按图索骥 下面我们简单从底层源码分析一下&#xff0c;请求是怎…

英语复习之英语形近词总结(四)

英语形近词总结复习第四部分&#xff1a; 单词 释义例句 genuine 英 /ˈdʒenjuɪn/ 美 /ˈdʒenjuɪn/ adj.真实的&#xff0c;真正的&#xff1b;诚恳的 1.Only genuine refugees can apply for asylum. 只有真正的难民才能申请政治避难。 《牛津词典》 2.This isnt a genui…

Java 区块链应用 | 割韭菜之假如K线涨跌可随意变动修改的实现

大家好&#xff0c;我是程序员大猩猩。 我一直在想&#xff0c;币圈这个行情时涨时跌&#xff0c;不断的割韭菜&#xff0c;不是由市场决定的&#xff01;而是由交易所直接输入一个数值后点击确定按钮而变化的&#xff0c;那么是不是很恐怖的行为。 为了验证这么一个想法&…

十个最适合论文写作的GPTs及其应用

文章目录 一、GPTs让一切皆有可能二、最适合论文写作的GPTs及其应用1、[Paper Search Engine](https://chat.openai.com/g/g-9v5gHG9Bo)2、[Academic Paper Specialist&#xff08;学术论文撰写专家&#xff09;](https://chat.openai.com/g/g-jryw3pfsH)3、[Paper Connect 论文…

day10-Map集合

Map 1.Map 1.1 Map简介 1.为什么使用Map集合 购物车提供的四个商品和购买的数量在后台需要容器存储。 每个商品对象都一一对应一个购买数量。 把商品对象看成是Map集合的键&#xff0c;购买数量看成Map集合的值。 例如: {商品12 , 商品23 &#xff0c; 商品3 2 , 商品4…

msvcp140dll怎么修复,分享5种有效的解决方法

MSVCP140.dll文件丢失这一现象究竟是何缘由&#xff0c;又会引发哪些令人头疼的问题呢&#xff1f;在探索这个问题的答案之前&#xff0c;我们先来深入了解这个神秘的DLL文件。MSVCP140.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它扮演着至关重要的…