我想在 Windows 文件资源管理器中获取发生复制/剪切或粘贴操作的文件或文件夹的位置,如下所示:
copied from D:\HTML&CSS file name : abc.html,home.html
pasted to E:\folder1 file name : abc.html,home.html
cut from D:\abcfolder file name : abc.txt,bac.txt
pasted to D:\new folder file name : abc.txt,bac.txt
有没有办法在 C++ 中使用 Windows API 来做到这一点?如果是这样,怎么样?
我尝试使用
AddClipboardFormatListener()
来收听剪贴板事件。它检测到复制操作,但未检测到粘贴事件的发生。但是当我剪切和粘贴时,检测到粘贴事件,但没有检测到复制和粘贴。
我的代码是:
#include <Windows.h>
#include <iostream>
LRESULT CALLBACK ClipboardUpdateCallback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
std::cout << "Message - > " << uMsg << std::endl;
std::cout << "W - > " << wParam << std::endl;
std::cout << "L - > " << lParam << std::endl;
if (uMsg == WM_CLIPBOARDUPDATE){
const char* operation = (IsClipboardFormatAvailable(CF_HDROP)) ? "Copy" : "Paste";
std::cout << operation << " operation detected." << std::endl;
if (IsClipboardFormatAvailable(CF_HDROP)){
if (OpenClipboard(NULL)){
HANDLE hData = GetClipboardData(CF_HDROP);
if (hData != NULL){
HDROP hDrop = (HDROP)hData;
const int count = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
for (int i = 0; i < count; ++i){
const int bufferSize = DragQueryFile(hDrop, i, NULL, 0) + 1;
wchar_t* buffer = new wchar_t[bufferSize];
DragQueryFileW(hDrop, i, buffer, bufferSize);
std::wcout << "File: " << buffer << std::endl;
delete[] buffer;
}
}
CloseClipboard();
}
}
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
int main(){
WNDCLASS wndClass = { 0 };
wndClass.lpfnWndProc = ClipboardUpdateCallback;
wndClass.lpszClassName = "ClipboardUpdateWndClass";
RegisterClass(&wndClass);
HWND hwnd = CreateWindow("ClipboardUpdateWndClass", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
AddClipboardFormatListener(hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)){
std::cout << "Message - > WHILE LOOP - > " << msg.message << std::endl;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
RemoveClipboardFormatListener(hwnd);
DestroyWindow(hwnd);
UnregisterClass("ClipboardUpdateWndClass", NULL);
return 0;
}
我尝试hook
CopyFileA()
函数,但是它不起作用。不知道我做的对不对,因为我hook函数调用的时候,hook函数运行了,但是在windows资源管理器里copy的时候没有效果
我是 Windows API 的新手,但我知道 C++。所以,我想知道我是否朝着正确的方向前进。还有别的办法吗?我研究了 DLL 注入,但我想问问知道这件事的人,所以我什至感谢对此的一点帮助、评论或想法。
我不想使用任何第三方库,例如 EasyHook 或 Detours。