gpt4 book ai didi

c# 在保存对话框上自定义控件——如何禁用父文件夹按钮?

转载 作者:太空狗 更新时间:2023-10-29 20:23:58 25 4
gpt4 key购买 nike

我正在使用此处的示例项目:http://www.codeproject.com/Articles/8086/Extending-the-save-file-dialog-class-in-NET

我已经隐藏了顶部的地址/位置栏并进行了其他修改,但我无法终生设法禁用让您转到父文件夹的按钮。 Ist 在 ToolbarWindow32 类中,这是问题所在。这是我目前拥有的,但它不起作用:

int parentFolderWindow = GetDlgItem(parent, 0x440);

//Doesn't work
//ShowWindow((IntPtr)parentFolderWindow, SW_HIDE);

//40961 gathered from Spy++ watching messages when clicking on the control
// doesn't work
//SendMessage(parentFolderWindow, TB_ENABLEBUTTON, 40961, 0);

// doesn't work
//SendMessage(parentFolderWindow, TB_SETSTATE, 40961, 0);

//Comes back as '{static}', am I working with the wrong control maybe?
GetClassName((IntPtr)parentFolderWindow, lpClassName, (int)nLength);

或者,如果他们使用父文件夹按钮并转到我不想让他们去的地方,我可以查看他们进入的新目录,有没有办法强制导航返回?

Screenshot

编辑:添加截图

最佳答案

//Comes back as '{static}', am I working with the wrong control maybe?

知道您使用了错误的控件,您希望看到“ToolbarWindow32”。一个非常重要的问题,对于 Codeproject.com 代码来说是一个常见的问题,就是该代码不再像发布的那样工作。自 2004 年以来,Windows 发生了太多变化。Vista 是自那时以来第一个添加了一套全新的 shell 对话框的版本,它们基于 IFileDialog。 .通过 IFileDialogCustomize 对其前身进行了很大改进,特别是自定义对话框是很多清洁器界面。这实际上不是您想要做的,自定义包括修改导航栏。

IFileDialogEvents 接口(interface)传递事件,你要找的是OnFolderChanging事件。旨在阻止用户离开当前文件夹,这是您真正想要做的事情。

虽然这在纸面上看起来不错,但我应该提醒您在实际尝试使用这些接口(interface)时。与 Windows shell 相关的任何东西的一个常见问题是,它们只使其易于从 C++ 中使用。 COM 接口(interface)是“不友好”的一种,基于 IUnknown 的接口(interface)没有类型库,您可以使用它轻松地添加对 C# 或 VB.NET 项目的引用。 Microsoft 发布了“Vista 桥接器”以使这些接口(interface)也可从 C# 中使用,看起来 like this .是的,哎呀。当您发现必须执行此操作两次时,请加倍厌恶,这仅适用于更高版本的 Windows,并且强烈暗示您正在尝试在 XP 上执行此操作(根据您找到的控件 ID 判断)。

这根本不是您想要支持的东西。由于备选方案非常简单,因此请改用受支持的 .NET FileOk 事件。 Winforms 示例:

    private void SaveButton_Click(object sender, EventArgs e) {
string requiredDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
using (var dlg = new SaveFileDialog()) {
dlg.InitialDirectory = requiredDir;
dlg.FileOk += (s, cea) => {
string selectedDir = System.IO.Path.GetDirectoryName(dlg.FileName);
if (string.Compare(requiredDir, selectedDir, StringComparison.OrdinalIgnoreCase) != 0) {
string msg = string.Format("Sorry, you cannot save to this directory.\r\nPlease select '{0}' instead", requiredDir);
MessageBox.Show(msg, "Invalid folder selection");
cea.Cancel = true;
}
};
if (dlg.ShowDialog() == DialogResult.OK) {
// etc...
}
}
}

关于c# 在保存对话框上自定义控件——如何禁用父文件夹按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23334827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com