在我的应用程序开始时,我将注册表的 shell 值更改为自定义 shell 并杀死 explorer.exe(它在应用程序之外完成),我希望允许后门返回原始 shell 并带回资源管理器。可执行程序。恢复进程对我来说很好,但是当我运行我的代码来更改注册表值时,没有抛出异常,但是当我签入 regedit 时该值没有改变,这是我的代码(在另一个问题上看到它):
RegistryKey regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon", true);
regKey.SetValue("Shell", "explorer.exe", RegistryValueKind.String);
regKey.Close();
Run Code Online (Sandbox Code Playgroud)
请帮忙
如何更新Windows资源管理器中显示的可用空间量?
假设打开Windows资源管理器并以编程方式删除某些文件.Windows资源管理器不会刷新以显示可用的新可用空间.
所以,我尝试使用SHChangeNotify这样的(Delphi代码):
ws := 'C:\';
SHChangeNotify (SHCNE_FREESPACE, SHCNF_PATH, PWideChar(ws), nil);
Run Code Online (Sandbox Code Playgroud)
但它不会更新"Windows资源管理器"中报告的值.
请帮忙.
我目前正在使用SHBrowseForFolder()打开浏览文件夹窗口但是当按下取消/确定时如何将焦点返回到我的主窗口.我读到我应该在对话框关闭之前重新启用我的主窗口,但究竟是哪里?有什么想法吗?
void buttonPush(HWND hWnd) {
EnableWindow(hWnd, FALSE);
BROWSEINFO bi = { 0 };
TCHAR szDir[MAX_PATH] = { 0 };
LPITEMIDLIST pid = NULL;
LPMALLOC pMalloc = NULL;
if (SUCCEEDED(SHGetMalloc(&pMalloc)))
{
ZeroMemory(&bi,sizeof(bi));
bi.hwndOwner = NULL;
bi.pszDisplayName = NULL;
bi.pidlRoot = NULL;
bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT | BIF_USENEWUI;
bi.lpfn = BrowseCallbackProc;
pidl = SHBrowseForFolder(&bi);
if (pidl)
{
// Folder selected in dialog
pMalloc->Free(pidl);
}
pMalloc->Release();
}
EnableWindow(hWnd, TRUE);
}
Run Code Online (Sandbox Code Playgroud) 我正在维护一个使用 Windows 资源管理器覆盖图标的应用程序。有时,某些操作需要我强制刷新特定文件夹的资源管理器视图。我使用以下使用 COM 的函数来执行此操作:
void RefreshExplorerView(CString strPath)
{
CComPtr<IShellWindows> pShellWindows;
CoInitialize(NULL);
if(SUCCEEDED(pShellWindows.CoCreateInstance(CLSID_ShellWindows)))
{
IDispatch* pFolder=NULL;
VARIANT variant;
V_VT(&variant) = VT_I4;
for(V_I4(&variant) = 0; pShellWindows->Item(variant, &pFolder) == S_OK; V_I4(&variant)++)
{
CComPtr<IWebBrowserApp> pWebBrowserApp;
if(SUCCEEDED(pFolder->QueryInterface(IID_PPV_ARGS(&pWebBrowserApp))))
{
BSTR LocationURL = NULL;
pWebBrowserApp->get_LocationURL(&LocationURL);
if(LocationURL != NULL && strPath.CompareNoCase(LocationURL) == 0)
{
CComPtr<IServiceProvider> pServiceProvider;
if(SUCCEEDED(pWebBrowserApp->QueryInterface(IID_PPV_ARGS(&pServiceProvider))))
{
CComPtr<IShellBrowser> pShellBrowser;
if(SUCCEEDED(pServiceProvider->QueryInterface(IID_PPV_ARGS(&pShellBrowser))))
{
IShellView* pShellView;
if(SUCCEEDED(pShellBrowser->QueryActiveShellView(&pShellView)))
{
pShellView->Refresh();
pShellView->Release();
}
}
}
}
SysFreeString(LocationURL);
}
pFolder->Release();
pFolder = NULL;
}
}
CoUninitialize();
}
Run Code Online (Sandbox Code Playgroud)
我注意到,当我的程序定期进行此刷新时,它的大小会慢慢增长,并且 UMDH 向我表明,每次运行时,我似乎都在泄漏pFolder和实例。 …
我写了一个python函数
def foo():
if A:
do something
if B:
exit(-1)
if __name__ == "__main__":
foo()
Run Code Online (Sandbox Code Playgroud)
有什么方法可以检查 foo 函数返回的退出代码吗?我从 Windows shell 运行它。
我需要确保explorer.exe作为系统shell运行.我需要做的是:
Winlogon\Shell)explorer.exeexplorer.exe(作为shell)在最后两个步骤之间是一场比赛:
所以问题是,是否有任何事件/互斥/回调我可以调用以确保资源管理器初始化为shell?
我设法做的最好是等待托盘窗口,如:
while(!FindWindow("Shell_TrayWnd", NULL)) {
sleep(250);
}
Run Code Online (Sandbox Code Playgroud)
这似乎有点草率,有更好的方法吗?
有几种方法可以获取给定扩展的描述和默认图标(没有完整路径),例如"*.doc"我想获得"Microsoft Word文档"和相关图标,您认为这将是最快的以下之一:
搜索注册表:
调用API ShGetFileInfo.我相信这有点慢.
根据Rob的说法,这里:如何使用Delphi从文件扩展名中获取图标和描述?
将IExtractIcon接口称为"更灵活,更高效"的替代方案.但它建议的顺序是使用IShellFolder接口,然后调用GetUIObjectOf获取文件的IExtractIcon接口,然后调用GetIconLocation和Extract来检索图标的句柄.(但是这个方法无法读取扩展描述?)
由于速度非常重要,因为我需要读取系统中所有文件类型的信息.
非常感谢你!
有很多解决方案可以限制应用程序运行两次.按进程名称搜索,使用命名的互斥锁等.但是如果我想将我的应用程序限制为shell会话,那么所有这些方法都不起作用.
用户可能在Windows上拥有多个登录会话和shell(对吗?)?如果这是真的,我希望能够在每个shell会话中运行我的应用程序的一个实例,但只允许一个.
有没有办法获得一个shell标识符,然后可以将其放入互斥锁名称?
我想知道,在Windows平台上是否有任何API/CSIDL来检索公共用户帐户的库文件夹路径?
像这样的路径:"C:\ Users\Public"
我目前正在运行Windows 7 x64 machine.
我编写了以下代码来右键单击添加上下文菜单:
RegistryKey rKey = Registry.ClassesRoot.OpenSubKey("Directory\\Background\\shell", true);
String[] names = rKey.GetSubKeyNames();
foreach (String s in names)
{
System.Windows.Forms.MessageBox.Show(s);
}
RegistryKey newKey = rKey.CreateSubKey("Your Application");
RegistryKey newSubKey = newKey.CreateSubKey("command");
newSubKey.SetValue("", "C:\\Windows\\System32\\notepad.exe");
newSubKey.Close();
newKey.Close();
rKey.Close();
Run Code Online (Sandbox Code Playgroud)
如果我直接在注册表上重复该过程,它可以工作,但不是通过这个.
我也能够访问注册表,因为我添加了一个片段,告诉列出我需要的所有子键,但根本不添加一个.
如何在windows命令shell中初始化一个变量?我试过
(
var $a=1
echo $a
)
Run Code Online (Sandbox Code Playgroud)
并得到一个错误
'var' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud) 在Delphi XE7中,我使用此代码创建指向特定文件夹的SHELL LINK.此文件夹显示在Windows资源管理器中,其中包含由此文件夹中的desktop.ini文件定义的自定义文件夹图标.应使用desktop.ini文件中的图标参数创建SHELL LINK,即指向与desktop.ini文件相同的图标资源.所以这是代码:
function GetDesktopIniIconDataFromFolder(const APath: string; var VIconIndex: Integer): string;
var
DeskTopIniFile: string;
DesktopIni: System.IniFiles.TIniFile;
ThisIconFileStr, ThisIconIndexStr: string;
ThisIconIndexInt: Integer;
begin
Result := '';
if DirectoryExists(APath) then
begin
DeskTopIniFile := IncludeTrailingPathDelimiter(APath) + 'Desktop.ini';
if FileExists(DeskTopIniFile) then
begin
DesktopIni := System.IniFiles.TIniFile.Create(DeskTopIniFile);
try
ThisIconFileStr := DesktopIni.ReadString('.ShellClassInfo', 'IconFile', '');
if ThisIconFileStr <> '' then
begin
ThisIconIndexStr := DesktopIni.ReadString('.ShellClassInfo', 'IconIndex', '');
if ThisIconIndexStr <> '' then
begin
ThisIconIndexInt := System.SysUtils.StrToIntDef(ThisIconIndexStr, MaxInt);
if ThisIconIndexInt <> MaxInt then
begin
Result := ThisIconFileStr;
VIconIndex := …Run Code Online (Sandbox Code Playgroud) 我正与同事讨论以下是否可行:
有谁知道我怎么做到这一点?
windows-shell ×13
windows ×7
c++ ×5
winapi ×4
c ×2
c# ×2
delphi ×2
atl ×1
cmd ×1
com ×1
contextmenu ×1
delphi-7 ×1
delphi-xe7 ×1
python-2.7 ×1
regedit ×1
registry ×1