本帖最后由 冥界3大法王 于 2026-4-6 11:44 编辑
最终升级版本,支持 单双文件 或 文件夹的 复制: 【最大化优化生成的 *.exe 仅10K】
[Asm] 纯文本查看 复制代码 Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\copypath]
@="复制完整路径"
"Icon"="D:\\网络相关\\袖珍版IDM.exe,0"
[HKEY_CLASSES_ROOT\*\shell\copypath\command]
@="\"d:\\CopyMultiPath.exe\" \"%1\""
[HKEY_CLASSES_ROOT\Directory\shell\copypath]
@="复制完整路径"
"Icon"="D:\\网络相关\\袖珍版IDM.exe,0"
[HKEY_CLASSES_ROOT\Directory\shell\copypath\command]
@="\"d:\\CopyMultiPath.exe\" \"%1\""
[Asm] 纯文本查看 复制代码 #define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
// 简单的字符串追加函数
void AppendText(wchar_t* dest, const wchar_t* src) {
wcscat(dest, src);
}
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow) {
int argc;
wchar_t** argv = CommandLineToArgvW(GetCommandLineW(), &argc);
if (argc < 2) return 0;
wchar_t tempPath[MAX_PATH];
GetTempPathW(MAX_PATH, tempPath);
lstrcatW(tempPath, L"xcopy_paths.tmp");
// 1. 写入文件 (使用原生 CreateFile)
HANDLE hFile = CreateFileW(tempPath, FILE_APPEND_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
// 写入路径 + 换行符
DWORD dwWritten;
WriteFile(hFile, argv[1], (DWORD)(wcslen(argv[1]) * sizeof(wchar_t)), &dwWritten, NULL);
WriteFile(hFile, L"\r\n", 4, &dwWritten, NULL);
CloseHandle(hFile);
}
// 2. 等待并发进程
Sleep(350);
// 3. 读取并设置剪贴板
hFile = CreateFileW(tempPath, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
DWORD fileSize = GetFileSize(hFile, NULL);
if (fileSize > 0) {
HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, fileSize + sizeof(wchar_t));
if (hMem) {
wchar_t* pData = (wchar_t*)GlobalLock(hMem);
DWORD dwRead;
ReadFile(hFile, pData, fileSize, &dwRead, NULL);
pData[fileSize / sizeof(wchar_t)] = L'\0'; // 结束符
// 移除末尾空白
int len = (int)wcslen(pData);
while (len > 0 && (pData[len - 1] == L'\r' || pData[len - 1] == L'\n' || pData[len - 1] == L' ')) {
pData[--len] = L'\0';
}
GlobalUnlock(hMem);
if (OpenClipboard(NULL)) {
EmptyClipboard();
SetClipboardData(CF_UNICODETEXT, hMem);
CloseClipboard();
}
}
}
CloseHandle(hFile);
DeleteFileW(tempPath); // 阅后即焚
}
LocalFree(argv);
return 0;
}
|