在Powershell中使用升级后的FolderBrowserDialog(“Vista风格”)

2023-12-10

我在用着电源外壳使用户能够浏览 Node.js 应用程序的文件/文件夹路径(因为到目前为止我还没有找到更好的轻量级替代方案),并且我遇到了处理可怕的、可怜的问题的老问题可用性FolderBrowserDialog不支持:

  • 粘贴路径
  • 访问快速访问项目
  • 改变视图
  • 排序或过滤项目
  • etc...

The bad dialog

标准脚本如下所示:

Function Select-FolderDialog($Description="Select Folder", $RootFolder="MyComputer"){
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null     
        
    $objForm = New-Object System.Windows.Forms.FolderBrowserDialog
    $objForm.RootFolder = $RootFolder
    $objForm.ShowNewFolderButton = $true
    $objForm.Description = "Please choose a folder"
    $Show = $objForm.ShowDialog()
    If ($Show -eq "OK")
    {
        Return $objForm.SelectedPath
    }
    Else
    {
        Write-Error "Operation cancelled by user."
    }
}
$folder = Select-FolderDialog
write-host $folder

I've used the Windows API CodePack for C# Windows Forms apps in the past to create a CommonOpenFileDialog with IsFolderPicker = true, giving me the features and accessibility of the OpenFileDialog with the ease of use of a managed folder browser. Better, but non-standard dialog

在我寻找一种在这里使用类似内容的方法时,我了解到常规的FolderBrowserDialog至少在 .Net Core 中得到了升级.
嗯,那很整洁。

有什么办法可以访问升级版本来自 PowerShell 脚本?

Adding $objForm.AutoUpgradeEnabled = $true上面的代码不会改变任何东西(而且确实是默认值)
(另外,如果有人知道如何以更直接的方式向 Node.js 应用程序提供像样的文件夹浏览器对话框,请给我留言 ^^)

到目前为止的解决方法:

1:滥用 OpenFileDialog

Function Select-FolderDialog($Description="Select Folder", $RootFolder="MyComputer"){
    [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null     

    $objForm = New-Object System.Windows.Forms.OpenFileDialog
    $objForm.DereferenceLinks = $true
    $objForm.CheckPathExists = $true
    $objForm.FileName = "[Select this folder]"
    $objForm.Filter = "Folders|`n"
    $objForm.AddExtension = $false
    $objForm.ValidateNames = $false
    $objForm.CheckFileExists = $false
    $Show = $objForm.ShowDialog()
    If ($Show -eq "OK")
    {
        Return $objForm.FileName
    }
    Else
    {
        Write-Error "Operation cancelled by user."
    }
}

$folder = Select-FolderDialog
write-host $folder

这将创建一个继承自更好的对话框文件对话框类,它仅显示文件夹,并使您能够返回类似“C:\Some dir\Dir I Want\[Select thisfolder]”的路径,即使它不存在,然后我可以将其修剪回“C:\我想要的一些目录\目录”。

Pros:

  • 根据需要提供全功能浏览器

Cons:

  • 文件名字段不能为空。尝试使用类似的东西 换行符会导致错误对话框抱怨 无效的文件名和FileOpenDialog拒绝归还 文件名,尽管ValidateNames is false.
  • 用户可以在文件名字段中输入任何内容,这可能会导致混乱。
  • 当您向上导航文件夹树时,单击接受按钮(“打开”)简单浏览器返回到先前选择的子目录,即使您取消选择它
  • 您必须修剪返回路径的最后一部分,并希望不会因选择不存在的文件而发生进一步的奇怪情况

2:给一个标准对话框一个编辑控件

使用Shell.BrowseForFolder method

# Included the options values from https://learn.microsoft.com/en-us/windows/win32/api/shlobj_core/ns-shlobj_core-browseinfoa
$BIF_RETURNONLYFSDIRS = [uint32]"0x00000001"
$BIF_DONTGOBELOWDOMAIN = [uint32]"0x00000002"
$BIF_STATUSTEXT = [uint32]"0x00000004"
$BIF_RETURNFSANCESTORS = [uint32]"0x00000008"
$BIF_EDITBOX = [uint32]"0x00000010" # <-- this is the important one
$BIF_VALIDATE = [uint32]"0x00000020"
$BIF_NEWDIALOGSTYLE = [uint32]"0x00000040" # <-- this sounds nice, but somehow changes nothing
$BIF_BROWSEINCLUDEURLS = [uint32]"0x00000080"
$BIF_USENEWUI = $BIF_NEWDIALOGSTYLE
$BIF_UAHINT = [uint32]"0x00000100"
$BIF_NONEWFOLDERBUTTON = [uint32]"0x00000200"
$BIF_NOTRANSLATETARGETS = [uint32]"0x00000400"
$BIF_BROWSEFORCOMPUTER = [uint32]"0x00001000"
$BIF_BROWSEFORPRINTER = [uint32]"0x00002000"
$BIF_BROWSEINCLUDEFILES = [uint32]"0x00004000"
$BIF_SHAREABLE = [uint32]"0x00008000"
$BIF_BROWSEFILEJUNCTIONS = [uint32]"0x00010000"

$options = 0
$options += $BIF_STATUSTEXT
$options += $BIF_EDITBOX
$options += $BIF_VALIDATE
$options += $BIF_NEWDIALOGSTYLE
$options += $BIF_BROWSEINCLUDEURLS
$options += $BIF_SHAREABLE
$options += $BIF_BROWSEFILEJUNCTIONS

$shell = new-object -comobject Shell.Application
$folder = $shell.BrowseForFolder(0, "Select a folder", $options)
if($folder){
    write-host $folder.Self.Path()
}

I included the options for clarity, but you could hard-code all of the the above into $folder = $shell.BrowseForFolder(0, "Select a folder", 98548), which is neat.
Look mom, auto-completing UNC paths
Pros:

  • 按预期使用文件夹浏览器对话框
  • 强大的用户体验
  • 可以粘贴路径
  • 支持 UNC 路径
  • 支持自动完成

Cons:

  • 没有带有快速访问项目等的侧面板
  • 无法更改视图、排序等
  • 没有预览/缩略图

哇,您可以在 PowerShell 中使用 C#!

环顾四周,我很羡慕每个人都在使用 C# 并利用我不知道如何在 PowerShell 中访问的很酷的功能。
我喜欢这种方法例如,它不依赖于旧版 API,并且具有针对不受支持的系统的后备方案。
然后我发现您可以在 PowerShell 中使用实际的 C#! 我将两者放在一起,稍微修改了代码,以便更容易从 PS 调用,并得出了一种相当轻量级、希望强大的方法来召唤用户可用的最佳文件夹浏览器对话框:

[Revised code below]

我很想听听关于整个方法的可靠性的意见。
无法访问某些参考或其他问题的可能性有多大?

不管怎样,我现在对这种方法很满意:)

编辑:PowerShell“核心”(pwsh.exe;较新的程序集)

So, as @mklement0评论中指出,积极开发电源外壳(以前(以及以后,为了可读性)称为“PowerShell Core”;与Windows PowerShellWindows 附带的)似乎对此不太适用。 在研究了 PS Core 无助地仅报告为“The type initializer for 'VistaDialog' threw an exception.“,(并添加对System.ComponentModel.Primitives),事实证明 PS Core 倾向于使用更新版本的System.Windows.Forms,就我而言5.0.4.0,它不包含类型FileDialogNative,更不用说它的嵌套类型了IFileDialog.
我试图强制它使用 Windows PS 引用的版本(4.0.0.0),但它不会遵守。

好吧,我终于花了不少钱,让 PS Core 简单地使用默认对话框,这已经是我一开始想要的升级版了 ????

因此,除了引入带有可选参数的构造函数方法的概念变化之外,我还为失败的“Vista 对话框”添加了后备方案。
我没有检查 PS 或单个程序集和/或类/类型的版本,而是简单地将调用包装在try/catch block.

$path = $args[0]
$title = $args[1]
$message = $args[2]

$source = @'
using System;
using System.Diagnostics;
using System.Reflection;
using System.Windows.Forms;
/// <summary>
/// Present the Windows Vista-style open file dialog to select a folder. Fall back for older Windows Versions
/// </summary>
#pragma warning disable 0219, 0414, 0162
public class FolderSelectDialog {
    private string _initialDirectory;
    private string _title;
    private string _message;
    private string _fileName = "";
    
    public string InitialDirectory {
        get { return string.IsNullOrEmpty(_initialDirectory) ? Environment.CurrentDirectory : _initialDirectory; }
        set { _initialDirectory = value; }
    }
    public string Title {
        get { return _title ?? "Select a folder"; }
        set { _title = value; }
    }
    public string Message {
        get { return _message ?? _title ?? "Select a folder"; }
        set { _message = value; }
    }
    public string FileName { get { return _fileName; } }

    public FolderSelectDialog(string defaultPath="MyComputer", string title="Select a folder", string message=""){
        InitialDirectory = defaultPath;
        Title = title;
        Message = message;
    }
    
    public bool Show() { return Show(IntPtr.Zero); }

    /// <param name="hWndOwner">Handle of the control or window to be the parent of the file dialog</param>
    /// <returns>true if the user clicks OK</returns>
    public bool Show(IntPtr? hWndOwnerNullable=null) {
        IntPtr hWndOwner = IntPtr.Zero;
        if(hWndOwnerNullable!=null)
            hWndOwner = (IntPtr)hWndOwnerNullable;
        if(Environment.OSVersion.Version.Major >= 6){
            try{
                var resulta = VistaDialog.Show(hWndOwner, InitialDirectory, Title, Message);
                _fileName = resulta.FileName;
                return resulta.Result;
            }
            catch(Exception){
                var resultb = ShowXpDialog(hWndOwner, InitialDirectory, Title, Message);
                _fileName = resultb.FileName;
                return resultb.Result;
            }
        }
        var result = ShowXpDialog(hWndOwner, InitialDirectory, Title, Message);
        _fileName = result.FileName;
        return result.Result;
    }

    private struct ShowDialogResult {
        public bool Result { get; set; }
        public string FileName { get; set; }
    }

    private static ShowDialogResult ShowXpDialog(IntPtr ownerHandle, string initialDirectory, string title, string message) {
        var folderBrowserDialog = new FolderBrowserDialog {
            Description = message,
            SelectedPath = initialDirectory,
            ShowNewFolderButton = true
        };
        var dialogResult = new ShowDialogResult();
        if (folderBrowserDialog.ShowDialog(new WindowWrapper(ownerHandle)) == DialogResult.OK) {
            dialogResult.Result = true;
            dialogResult.FileName = folderBrowserDialog.SelectedPath;
        }
        return dialogResult;
    }

    private static class VistaDialog {
        private const string c_foldersFilter = "Folders|\n";
        
        private const BindingFlags c_flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;
        private readonly static Assembly s_windowsFormsAssembly = typeof(FileDialog).Assembly;
        private readonly static Type s_iFileDialogType = s_windowsFormsAssembly.GetType("System.Windows.Forms.FileDialogNative+IFileDialog");
        private readonly static MethodInfo s_createVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("CreateVistaDialog", c_flags);
        private readonly static MethodInfo s_onBeforeVistaDialogMethodInfo = typeof(OpenFileDialog).GetMethod("OnBeforeVistaDialog", c_flags);
        private readonly static MethodInfo s_getOptionsMethodInfo = typeof(FileDialog).GetMethod("GetOptions", c_flags);
        private readonly static MethodInfo s_setOptionsMethodInfo = s_iFileDialogType.GetMethod("SetOptions", c_flags);
        private readonly static uint s_fosPickFoldersBitFlag = (uint) s_windowsFormsAssembly
            .GetType("System.Windows.Forms.FileDialogNative+FOS")
            .GetField("FOS_PICKFOLDERS")
            .GetValue(null);
        private readonly static ConstructorInfo s_vistaDialogEventsConstructorInfo = s_windowsFormsAssembly
            .GetType("System.Windows.Forms.FileDialog+VistaDialogEvents")
            .GetConstructor(c_flags, null, new[] { typeof(FileDialog) }, null);
        private readonly static MethodInfo s_adviseMethodInfo = s_iFileDialogType.GetMethod("Advise");
        private readonly static MethodInfo s_unAdviseMethodInfo = s_iFileDialogType.GetMethod("Unadvise");
        private readonly static MethodInfo s_showMethodInfo = s_iFileDialogType.GetMethod("Show");

        public static ShowDialogResult Show(IntPtr ownerHandle, string initialDirectory, string title, string description) {
            var openFileDialog = new OpenFileDialog {
                AddExtension = false,
                CheckFileExists = false,
                DereferenceLinks = true,
                Filter = c_foldersFilter,
                InitialDirectory = initialDirectory,
                Multiselect = false,
                Title = title
            };

            var iFileDialog = s_createVistaDialogMethodInfo.Invoke(openFileDialog, new object[] { });
            s_onBeforeVistaDialogMethodInfo.Invoke(openFileDialog, new[] { iFileDialog });
            s_setOptionsMethodInfo.Invoke(iFileDialog, new object[] { (uint) s_getOptionsMethodInfo.Invoke(openFileDialog, new object[] { }) | s_fosPickFoldersBitFlag });
            var adviseParametersWithOutputConnectionToken = new[] { s_vistaDialogEventsConstructorInfo.Invoke(new object[] { openFileDialog }), 0U };
            s_adviseMethodInfo.Invoke(iFileDialog, adviseParametersWithOutputConnectionToken);

            try {
                int retVal = (int) s_showMethodInfo.Invoke(iFileDialog, new object[] { ownerHandle });
                return new ShowDialogResult {
                    Result = retVal == 0,
                    FileName = openFileDialog.FileName
                };
            }
            finally {
                s_unAdviseMethodInfo.Invoke(iFileDialog, new[] { adviseParametersWithOutputConnectionToken[1] });
            }
        }
    }

    // Wrap an IWin32Window around an IntPtr
    private class WindowWrapper : IWin32Window {
        private readonly IntPtr _handle;
        public WindowWrapper(IntPtr handle) { _handle = handle; }
        public IntPtr Handle { get { return _handle; } }
    }
    
    public string getPath(){
        if (Show()){
            return FileName;
        }
        return "";
    }
}
'@
Add-Type -Language CSharp -TypeDefinition $source -ReferencedAssemblies ("System.Windows.Forms", "System.ComponentModel.Primitives")
([FolderSelectDialog]::new($path, $title, $message)).getPath()

这应该适用于Windows PowerShell(最终版本~5.1)和当前的 PS“核心”(pwsh.exe ~7.1.3)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Powershell中使用升级后的FolderBrowserDialog(“Vista风格”) 的相关文章

  • Winforms 中的可视化树形图

    是否有用于在 C 2 0 WinForms 中构建方形树形图的框架 与此类似的东西 from http www codeproject com KB recipes treemaps aspx http www codeproject co
  • 获取光标相对于控件的位置 - C#

    我想获取鼠标相对于鼠标指针所在控件的位置 这意味着当我将光标置于控件的起点 左上角 时 它应该给出 0 0 我正在使用以下代码 private void panel1 MouseMove object sender MouseEventAr
  • powershell cmdlet 的枚举参数

    我正在 powershell 上编写一个 cmdlet 脚本 我想使用 eum 作为参数之一 但我不知道在哪里放置枚举定义 以便它对于 cmdlet 参数声明可见 例如 我有这样的脚本参数定义 cmdletbinding param Par
  • 为什么 C# 编译的正则表达式比等效的字符串方法更快?

    每次我必须对字符串执行简单的包含或替换操作 其中我正在搜索的术语是固定值 时 我发现如果我获取示例输入并对其进行一些分析 则使用编译的正则表达式是几乎 总是比使用 String 类中的等效方法更快 我尝试过比较多种方法 hs是要搜索的 干草
  • 正则表达式基于组的不同替换?

    所以我对正则表达式比较陌生 并且做了一些练习 我正在玩一个简单的 混淆器 它只是寻找 dot or dot or at or at 不区分大小写 并且在匹配项之前或之后有或没有任意数量的空格 这是针对通常情况的 someemail AT d
  • EWS - 访问共享日历项目/约会

    我正在尝试获取共享日历的所有项目 我已关注EWS 访问所有共享日历 https stackoverflow com questions 23766747 ews access all shared calendars 23773834 23
  • 如何避免由于 DI 容器绑定要求而导致 BAL 依赖于 DAL?

    我的应用程序由三个项目组成 核心 DAL 和 BAL 核心包含域对象 客户 订单 产品 它还包含基本的 IRepository 接口 IRepository
  • PowerShell 中哈希表的并集和交集

    In PowerShell 中的并集和交集 https stackoverflow com questions 8609204 union and intersection in powershell描述了用于数组集合操作的酷单行代码 我想
  • 将 ASP.NET Intranet 应用程序与 Outlook 日历集成的技术

    我不能再忽视用户的叫喊声了 他们想要一个任务调度系统 而在某些时候我必须交付 我正在考虑制作自己的系统 并不难 但是用户将拥有两个并行的任务管理系统 因为他们已经使用 Outlook 来完成相同的事情 在 Outlook 日历 任务集成方面
  • 将多对多关系与实体框架中的属性映射

    我总是使用属性将实体的属性映射到相应的列 这是一个例子 Table news entries public class News Key public int Id get set Column d date public DateTime
  • 使用.NET代码将系统时间同步到域控制器

    我要运行基于时间的测试 需要在测试期间多次更改系统时间 我希望能够在测试结束时将时间重新同步到域控制器时间 我有任何方法可以使用 NET 代码 C 来做到这一点 我正在使用以下位置的 p invoke 函数更改时间 使用 C 以编程方式设置
  • 我应该更喜欢 C# 中的静态方法吗

    在花了一些时间学习函数式编程之后 我越来越自然地想要使用不执行任何突变的静态方法 我有什么理由应该抑制这种本能吗 我觉得这个问题有点奇怪 因为静态方法和不执行突变的方法是方法的两个正交分类 您可以拥有可变静态方法和非可变实例方法 对我来说
  • Spring.Net可以起到PostSharp的作用吗?

    几个月前 我发现了 PostSharp 有一段时间 它非常棒 但随后法律部门回复说他们不喜欢旧版本的许可证 然后部门告诉我2 0的价格高得令人无法接受 对于我们需要的座位数量 我非常失望 但并不沮丧 我想 这不可能是唯一的这样的框架 我一直
  • 设置 Cursor.Position“half”-有效(从一台显示器到另一台)

    我有两个显示器 其中一个是非主显示器 number 1 设置为主要的 number 2 左上角像这样 我再说一遍 number 2是主监视器 这是代码 Cursor Position new Point 500 500 发生的情况是 当光标
  • 使用反应式扩展对事件进行单元测试

    我在用着 NET 的反应式扩展 Rx http msdn microsoft com en us devlabs ee794896 aspx将事件公开为IObservable
  • Windows 窗体和 XNA - 绘制不是实时的

    我目前正在为 XNA 开发一个关卡编辑器 它是通过结合 Windows 窗体和 XNA 构建的 我正在使用 App Hub 上示例中的内容链接文本 http create msdn com en US education catalog s
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 使用 POST 的 HttpWebRequest 的性能

    我有一个用于测试网络服务的小工具 它可以使用 POST 或 GET 调用 Web 服务 使用POST的代码是 public void PerformRequest WebRequest webRequest WebRequest Creat
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • 如何在Windows窗体中打开进程

    我想在我的 Windows 窗体应用程序中打开进程 例如 我希望当用户按下 Windows 窗体容器之一中的按钮时 mstsc exe 将打开 如果他按下按钮 它将在另一个容器上打开 IE DllImport user32 dll SetL

随机推荐

  • Unity GUIText 碰撞 C#

    我正在用 C 编写一个 3D 迷宫程序 我需要让 UI 文本显示 你赢了 当玩家到达迷宫的尽头时 我在 Unity 中设置了一个名为 FinishLine 的立方体触发器 并且有名为 winText 的 UI 文本 我在这条线上遇到错误 G
  • 如何使选择查询在具有 4 列(sno、sname、job、dept)、有 10 条记录的简单表上运行超过 30 分钟?

    我想用我的应用程序服务器创建一个测试用例 该服务器连接到 oracle 数据库并执行选择查询 此选择查询需要运行超过 30 分钟 并且必须从具有 4 列 sno sname job dept 的表返回结果 您能给我一个运行时间超过 30 分
  • Alexa Skills Set SDK - 增加技能超时

    我正在使用 Node js 上的 Alexa Skill Set SDK 构建 Alexa 教学练习技能 我将每个烹饪步骤保存到数据库中 因此如果技能超时 用户可以重新打开技能并从中断处继续 问题是 用户对必须不断重新打开技能感到恼火 人们
  • Android SupportMapFragment.getMap() 返回 null

    在我的以下代码中 getMap 返回 null 这会停止应用程序 如果我不对地图执行任何操作 即删除最后两行 它就会正确显示 知道为什么吗 谢谢 public void onCreate Bundle savedInstanceState
  • 多个站点位于同一目录但独立的数据库中

    在我使用 HostGator 建立的基于 Linux 的共享主机帐户中 很快就会有十几个站点 我的帐户中的 CPanel 备份有文件数限制 为了减少文件总数 我需要大家的建议 以便我继续使用 Drupal 6 添加新的站点 我不想只是为了简
  • 在python3下取消python2日期时间

    我选择使用 pickle base64 TCP 套接字 在 python3 代码和旧版 python2 代码之间通信数据 但我遇到了问题datetime对象 PY3 对象在 PY2 上很好地解封 但相反会引发TypeError当调用日期时间
  • 在 Google Apps 脚本中,如何保留用户输入中的换行符?

    我有一个 TextArea 我正在从中收集用户输入 我想将此输入返回到电子邮件中 但保留格式很重 要 如果有人输入返回或段落来分隔他们的陈述 我希望这能够反映在输出中 目前 我将此输入分配给一个变量 然后在 MailApp 调用中引用该变量
  • SVG 图案中使用的圆帽线

    当前使用 SVG
  • 在 python pandas 中合并数据帧而不重复行[重复]

    这个问题在这里已经有答案了 我想使用相似的列 A 组合两个数据框 gt gt gt df1 A B 0 I 1 1 I 2 2 II 3 gt gt gt df2 A C 0 I 4 1 II 5 2 III 6 为此 我尝试使用 合并 p
  • 查找并替换数组中的重复项,但用不同的字符串替换每个第 n 个实例

    我下面有一个由重复字符串组成的数组 我想查找并替换这些字符串 但每次匹配时我想更改替换字符串的值 让我演示一下 该示例数组 SampleArray champ king king mak mak mak 应该改为 SampleArray c
  • Google 登录可在开发版本中工作,但不能在预览版本中工作

    我正在构建一个带有 expo 和 React Native 的应用程序 我通过 firebase 使用 Google 登录 当我运行 iOS 开发版本时 登录功能完美运行 但是 当我运行 iOS 预览版本时 出现以下错误 访问被阻止 此应用
  • 已通过身份验证,但 user.is_authenticated 仍为 false

    使用 GAE Django nonrel 创建简单的应用程序 我不认为问题特定于 GAE 或 nonrel 分支 最有可能是 PEBKAC 作为 python django noob 并且会在基本 django 安装时发生 我正在使用 dj
  • 无法使用 Python SqlAlchemy 将数据写入 Vertica 数据库 - 类型“TEXT”不存在

    我正在尝试将 pandas 数据框上传到 Vertica 数据库 能够使用 sqlalchemy 设置引擎和查询数据库 但是 当我尝试从 pandas dataframe 上传数据时 会收到错误消息 因为类型 TEXT 不存在 我使用的是
  • TAPI 的替代技术?

    是否有支持第三方呼叫控制 3pcc 的 TAPI 替代技术 我想在应用程序中提供以下 3pcc 功能 拨出电话 用户单击应用程序中的按钮 用户的电话摘机 被叫电话振铃 被叫者的电话显示被叫者的电话号码 而不是用于应用程序的电话号码 当被叫者
  • 无法使用 Selenium Webdriver 打开 Chrome 浏览器。管理员禁止加载解压的扩展

    我正在使用 Selenium Webdriver C Visual Studio 和 Chrome 浏览器自动化我的应用程序 当 selenium 尝试打开 chrome 浏览器时 我出现在弹出窗口下方 Failed to load ext
  • 附上Java源代码

    我一生都无法将 java 源代码附加到 eclipse 中 这样我就可以看到该语言的内部工作原理 甚至不是像 String 类这样简单的东西 当我运行 java version 时 这就是我所拥有的 java version 1 6 0 1
  • 视口原点动画

    我正在开发一个 Windows Phone 应用程序 其中有一个视口控制器 使我能够放大和缩小内容 我想将缩放居中于缩放点 我可以做什么 Viewportcontroller SetViewportOrigin 但这使得viewportco
  • 如何将数据框(R)导出到Oracle表中

    我需要一个如何将数据从 R 传输到 Oracle 表的建议 我有一个 R 数据框 我想将其传输到特定的 Oracle 表 整个数据框或某些列 作为一个选项 通过 R 将放置在 csv 文件中的数据帧传输到 Oracle 中 我已经在整个 i
  • 有没有办法在没有 JQuery UI 的情况下使用自动完成功能

    有没有办法在没有 JQuery UI 的情况下使用自动完成功能 因为 JQuery UI 的占用空间太大 包括其 CSS 或者是否有任何替代插件或其他东西 我用谷歌搜索了很多 但没有找到任何 您可以构建自己的不依赖于 JQuery UI 它
  • 在Powershell中使用升级后的FolderBrowserDialog(“Vista风格”)

    我在用着电源外壳使用户能够浏览 Node js 应用程序的文件 文件夹路径 因为到目前为止我还没有找到更好的轻量级替代方案 并且我遇到了处理可怕的 可怜的问题的老问题可用性FolderBrowserDialog不支持 粘贴路径 访问快速访问