有没有办法在windows文件资源管理器中监控和捕获复制、剪切和粘贴操作,并获取文件或文件夹的位置和名称?

问题描述 投票:0回答:0

我想在 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。

c++ windows winapi
© www.soinside.com 2019 - 2024. All rights reserved.