現在有個需求就是判斷檔案夾內被選中的檔案是不是符合一定規則,如果符合就不讓選中,具體代碼是參考https://blogs.msdn.microsoft.com/oldnewthing/20040720-00/?p=38393
有一下問題
1) 我看GetOpenFileName打開的檔案夾類名是#32770與其他檔案夾類名不同,這種是不是shell視窗
2) 參考上述代碼是能實作左鍵點擊獲取檔案名 但是我想如同IContentmenu一樣 注冊到資源管理器里面 但是不知道怎么集成到ATL專案中,比如Ifolderview介面
最主要的還是操作#32770內的檔案
uj5u.com熱心網友回復:
//#32770 The class for a dialog box. ?GetOpenFileName
The GetOpenFileName function creates an Open common dialog box that lets the user specify the drive, directory, and the name of a file or set of files to open.
BOOL GetOpenFileName(
LPOPENFILENAME lpofn // address of structure with initialization
// data
);
uj5u.com熱心網友回復:
自己寫的程式可以用ofnhookproc來抓CDN_SELCHANGE然后看情況把IDOK這個按鈕給禁用掉。別人寫的程式開的檔案對話框就沒辦法了,新的程式都是用的IFileDialog。就算有還在用ofn的別人也可能有自己寫的ofnhookproc。
uj5u.com熱心網友回復:
一個定制CFileDialog對話框的實體uj5u.com熱心網友回復:
主要就是應對別人開的檔案對話框,ifiledialog我感覺不能同icontentmenu一樣 有系統管理,有沒有什么解決辦法
uj5u.com熱心網友回復:
不是自己擼一個對話框 是操作別人對話框
uj5u.com熱心網友回復:
為啥你要改別的程式的行為……而且只改OpenFileName,自己寫的檔案對話框就無視掉么?
uj5u.com熱心網友回復:
需求就是 要檢測別人的打開檔案夾中選中的檔案是不是符合要求
uj5u.com熱心網友回復:
用 spy++ 先 找到 // 1148 0x47C cmb13‘檔案名’那個 視窗的 屬性。
程式 發現 這個 視窗 取 這個 視窗 的 內容 , GETWINDINDOWTEXT.
uj5u.com熱心網友回復:
問題是為什么要檢測。可能有對系統侵入比較少的解決方案。你真想做的話注入個DLL到目標程式然后嘗試給每個新對話框發WM_USER+7看看對方有沒有回應,
以前某知名影像預覽軟體做過檔案對話框劫持,就是在別人的程式打開檔案的時候加了個預覽框,然后各種應用崩潰。然后市場占有率大降。
看起來跟你需求類似的應用還不少……
所有圖片類應用程式,在“打開檔案”對話框彈出后程式崩潰
https://answers.microsoft.com/zh-hans/windows/forum/windows_10-files-winpc/%E6%89%80%E6%9C%89%E5%9B%BE%E7%89%87%E7%B1%BB/a2f17e9c-f3d8-4e01-85da-8a3961fcaad5
uj5u.com熱心網友回復:
怎么獲取windows xp上選中的檔案呢 下面是我下的代碼
uj5u.com熱心網友回復:
TCHAR szBuff[256] = {0};
IShellWindows *psw = NULL;
HRESULT hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void**)&psw);
if (SUCCEEDED(hr))
{
HWND hExplorer = NULL;
hExplorer = GetForegroundWindow();
GetClassName(hExplorer, szBuff, sizeof(szBuff) / sizeof(TCHAR));
OutputDebugStringW(szBuff);
VARIANT v;
BOOL fFound = FALSE;
long count = -1;
IDispatch *pdisp;
if (SUCCEEDED(psw->get_Count(&count)))
{
OutputDebugStringA("獲取 shell windows");
OutputDebugStringA(StringUtil::int32ToString(count).c_str());
if (wcscmp(szBuff, L"Progman") == 0 )
{
V_VT(&v) = VT_UI4;
v.ulVal = SWC_DESKTOP;
if (SUCCEEDED(psw->Item(v, &pdisp)))
{
OutputDebugStringA("into psw");
if (pdisp != NULL)
{
uj5u.com熱心網友回復:
OutputDebugStringA("pdisp not null");setShellItemSelectStatus(pdisp, hExplorer);
pdisp->Release();
}
}
}
uj5u.com熱心網友回復:
檔案對話框又不是桌面……這代碼是訪問桌面的uj5u.com熱心網友回復:
就是訪問桌面 但是在xp下 訪問失敗,研究了一下 是xp沒有desktop的感念,V_VT(&v) = VT_UI4; v.ulVal = SWC_DESKTOP;這值就沒辦法生效,看了兩天 也沒有找到解決方案
uj5u.com熱心網友回復:
ConstantsSWC_EXPLORER
An Windows Explorer (Explorer.exe) window.
SWC_BROWSER
An Internet Explorer (Iexplore.exe) browser window.
SWC_3RDPARTY
A non-Microsoft browser window.
SWC_CALLBACK
A creation callback window.
SWC_DESKTOP
Windows Vista and later. The Windows desktop.
uj5u.com熱心網友回復:
https://blogs.msdn.microsoft.com/oldnewthing/20130318-00/?p=4933/有用嗎 ?
uj5u.com熱心網友回復:
如果是我,將符合條件的檔案屬性改為隱藏。uj5u.com熱心網友回復:
就是這個問題啊 SWC_DESKTOP xp上不能用 很頭疼
uj5u.com熱心網友回復:
這個代碼我也看了 跟我的原理相同 或者說就是同一個人寫的uj5u.com熱心網友回復:
趙老師 有沒有辦法處理xp桌面上的檔案uj5u.com熱心網友回復:
SWC_DESKTOP的支持是Vista才加的。之前的實作是沒有定規的,因為有ActiveDesktpo這回事,用戶可以HTML檔案,上面什么都可以有。你不是要控制別的程式的檔案打開對話框么?怎么突然改桌面了。
而且你那個代碼有什么用?用戶隨便在桌面一點就你的作業就白費了。還是把你的需求列出來,我很懷疑你的用戶會允許你去限制自己能在桌面上選擇什么圖示。
uj5u.com熱心網友回復:
需求很簡單 就是禁止用戶選中特定的檔案 ,我在資源管理器中注入了一個dll 去hook用戶點點擊事件 判斷當前激活的視窗 然后根據視窗去獲取選中的檔案名 判斷是否是規定的檔案 如果是就設定非選中狀態 之前一直在win7上測驗 后來在xp上發現不行 打開檔案夾只是這個需求的一部分uj5u.com熱心網友回復:
用戶用安全模式啟動,你的代碼都不會有機會執行,你怎么禁止用戶選?放桌面上或者我的檔案里的檔案都是應該計劃好可以被用戶洗掉的。
uj5u.com熱心網友回復:
問題一步一步解決 得先能實作xp桌面檔案不可選中 我這功能是一大模塊下的小分支 如果安全模式禁止我這功能的話 那整個模塊都將失效 所以說安全模式對我來說問題不是最嚴重的uj5u.com熱心網友回復:
是 Shell 外殼擴展 編程 吧?uj5u.com熱心網友回復:
是的 有研究嗎uj5u.com熱心網友回復:
ActiveDesktpo了解一下還是不知道怎么做 能給個思路嗎uj5u.com熱心網友回復:
“The SHELLEXT sample demonstrates how to implement the basic shellextensions. These include context menu, property sheet, icon handler, and
copy hook extensions. This sample does not implement a drag-drop handler,
but the implementation would be very similar to context menu handlers.”
uj5u.com熱心網友回復:
IShellFolder *psf;
if (SUCCEEDED(SHGetDesktopFolder(&psf)))
{
OutputDebugStringA("into SHGetDesktopFolder");
IShellView* psve;
SFV_CREATE sfv;
sfv.cbSize = sizeof(SFV_CREATE);
sfv.psfvcb = NULL;
sfv.pshf = psf;
sfv.psvOuter = NULL; /**/
if (SUCCEEDED(SHCreateShellFolderView(&sfv, (IShellView**)&psve)))
{
OutputDebugStringA("into CreateViewObject");
IEnumIDList* pedl;
LPITEMIDLIST pidlItem;
if (SUCCEEDED(psf->EnumObjects(hExplorer, SHCONTF_NONFOLDERS, &pedl)))
{
OutputDebugStringA("into pedl");
int index = 0;
do
{
int bindex = 0;
STRRET str;
pedl->Next(index++, &pidlItem, (ULONG*)&bindex);
if (SUCCEEDED(psf->GetDisplayNameOf(pidlItem, SHGDN_FORPARSING, &str)))
{
TCHAR szItem[MAX_PATH];
StrRetToBuf(&str, pidlItem, szItem, MAX_PATH);
if (isReviseFile(szItem))
{
OutputDebugString(szItem);
psve->SelectItem(pidlItem, SVSI_DESELECT);
}
}
} while (pidlItem != NULL);
}
psve->Release();
}
psf->Release();
}
這段代碼中雖然ishellview不是NULL 但是執行psve->SelectItem(pidlItem, SVSI_DESELECT);沒有效果
uj5u.com熱心網友回復:
這是在xp桌面下
uj5u.com熱心網友回復:
https://blogs.msdn.microsoft.com/oldnewthing/20130318-00/?p=4933/
有用嗎 ?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/67025.html
