微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从Windows回收站以编程方式删除没有UI对话框的项目

如何解决从Windows回收站以编程方式删除没有UI对话框的项目

我正在将IContextMenu与动词"delete"一起使用,以清除回收站中的项目,但是即使我使用了CMIC_MASK_FLAG_NO_UI标志,也会弹出UI对话框。有没有其他方法可以从回收站删除文件不显示对话框?

IContextMenu* contextMenu;
recycleBin->GetUIObjectOf(0,1,(LPCITEMIDLIST*)(&pidl),IID_IContextMenu,(LPVOID *)&contextMenu);
CMINVOKECOMMANDINFO ci;
memset(&ci,sizeof(ci));
ci.fMask = CMIC_MASK_FLAG_NO_UI;
ci.cbSize = sizeof(CMINVOKECOMMANDINFO);
ci.lpVerb = "delete";
contextMenu->InvokeCommand(&ci);
contextMenu->Release();

完整的代码包括回收站对象初始化和项目枚举)位于gist

解决方法

您可以安装一个WH_CBT挂钩,并在其回调中监视nCode HCBT_CREATEWND。如果获得匹配的类名(“#32770(对话框)”?)和匹配的标题从回调中返回非零值,则可以发送BM_CLICK来单击Yes按钮,对话框将自动关闭。

代码示例:

main.cpp

#include <iostream>
#include <windows.h>
#include <Ole2.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <string>

#pragma comment(lib,"Shlwapi.lib")

HHOOK g_hhook;

int main()
{
    OleInitialize(0);

    HINSTANCE hinstDLL = LoadLibrary(TEXT("D:\\xxx\\Dll_WH_CBT\\Debug\\Dll_WH_CBT.dll"));
    HHOOK(*AttachHookProc)(DWORD);
    AttachHookProc = (HHOOK(*)(DWORD)) GetProcAddress(hinstDLL,"AttachHook");
    void(*RemoveHooks)(DWORD);
    RemoveHooks = (void(*)(DWORD))GetProcAddress(hinstDLL,"RemoveHooks");

    IShellFolder* desktop;
    if (FAILED(SHGetDesktopFolder(&desktop))) {
        std::cerr << "Failed to get desktop fodler" << std::endl;
        return -1;
    }

    ...
    IEnumIDList* enumFiles;
    if (FAILED(recycleBin->EnumObjects(0,SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | 
SHCONTF_INCLUDEHIDDEN,&enumFiles)))
    {
        std::cerr << "Could not enumerate recycle bin objects" << std::endl;
        recycleBin->Release();
        return -1;
    }

    AttachHookProc(0);

    ...
      
    RemoveHooks(0);
    enumFiles->Release();
    recycleBin->Release();

    OleUninitialize();
    return 0;
}

Dll:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"
#include <Windows.h>

HMODULE thisModule;
HHOOK g_hhook;

LRESULT CALLBACK CBTProc(int nCode,WPARAM wParam,LPARAM lParam)
{        
    switch (nCode)
    {
    case HCBT_CREATEWND:
    {      
        HWND File_Window = FindWindow(L"#32770",L"Delete File"); 
        HWND Folder_Window = FindWindow(L"#32770",L"Delete Folder");
        if (File_Window)
        {
            HWND yes = FindWindowEx(File_Window,NULL,L"Button",L"&Yes");
            SendMessage(yes,BM_CLICK,0);
            SendMessage(yes,0);
        }
        if (Folder_Window)
        {
            HWND yes = FindWindowEx(Folder_Window,0);
        }
        break;
    }
    default:
        break;
    }
    return CallNextHookEx(g_hhook,nCode,wParam,lParam);
}

#ifdef __cplusplus    //If used by C++ code.
extern "C" {        //we need to export the C interface
#endif
    _declspec(dllexport) HHOOK AttachHook(DWORD threadID) {
        g_hhook = SetWindowsHookEx(WH_CBT,CBTProc,thisModule,threadID);

        return g_hhook;
    }
#ifdef __cplusplus
}
#endif

extern "C" {        //we need to export the C interface
    __declspec(dllexport) void RemoveHooks(DWORD)
    {
        UnhookWindowsHookEx(g_hhook);
    }
}

BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved
                     )
{
    thisModule = hModule;
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:      
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:

        break;
    }
    return TRUE;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。