标签: winforms

如何为我的应用程序为所有用户创建的文件授予完全权限?

我开发的工具需要将访问权限"完全控制"授予由它创建的文件.需要从所有Windows帐户甚至可能的未来帐户中读取,修改和删除它.这可以实现吗?

我知道我可以尝试使用SPECIFIC_USER:

FileSystemAccessRule rule = new FileSystemAccessRule(SPECIFIC_USER, FileSystemRights.FullControl, AccessControlType.Allow);
FileSecurity fSecurity = File.GetAccessControl(filePath);
fSecurity.SetAccessRule(rule);
File.SetAccessControl(filePath, fSecurity);
Run Code Online (Sandbox Code Playgroud)

但是如何将其授予所有用户?甚至可能的未来帐户?如果后一部分不可能,如何进行第一项要求?

谢谢.

编辑:

这是适合我的代码.取自回答者的链接.

private bool GrantAccess(string fullPath)
{
    DirectoryInfo dInfo = new DirectoryInfo(fullPath);
    DirectorySecurity dSecurity = dInfo.GetAccessControl();
    dSecurity.AddAccessRule(new FileSystemAccessRule(
        new SecurityIdentifier(WellKnownSidType.WorldSid, null), 
        FileSystemRights.FullControl,
        InheritanceFlags.ObjectInherit | InheritanceFlags.ContainerInherit,
        PropagationFlags.NoPropagateInherit,
        AccessControlType.Allow));

    dInfo.SetAccessControl(dSecurity);
    return true;
}
Run Code Online (Sandbox Code Playgroud)

注意PropagationFlags.NoPropagateInherit哪个是必需的(在链接的最后面提到).它确实为未来的账户授予特权.

.net c# permissions user-accounts winforms

70
推荐指数
2
解决办法
7万
查看次数

在上下文菜单下单击查找节点

如何找出树列表中的哪个节点已激活上下文菜单?例如,右键单击节点并从菜单中选择一个选项.

我无法使用TreeViews的SelectedNode属性,因为该节点只是右键单击而未选中.

c# treeview contextmenu winforms

69
推荐指数
4
解决办法
5万
查看次数

如何从Windows窗体DateTimePicker控件中只获取日期值?

我正在用C#代码构建一个应用程序.
如何仅从DateTimePicker控件获取日期值?

c# date datetimepicker winforms

69
推荐指数
4
解决办法
31万
查看次数

C#GUI命名约定的最佳实践?

GUI,无论是用WinForms还是XAML编写,似乎在我看到的项目之间具有最广泛的命名约定.对于一个TextBox人的名字的简单,我已经看到了各种命名约定:

TextBox tbName      // Hungarian notation
TextBox txtName     // Alternative Hungarian
TextBox NameTextBox // Not even camelCase
TextBox nameTextBox // Field after field with TextBox on the end
TextBox TextBoxName // Suggested in an answer...
TextBox textBoxName // Suggested in an answer...
TextBox uxName      // Suggested in an answer...
TextBox name        // Deceptive since you need name.Text to get the real value
TextBox textBox1    // Default name, as bad as you can get
Run Code Online (Sandbox Code Playgroud)

我通常会遵守所有.cs文件的StyleCop规则,并且看到其他人也这样做,但GUI往往会违反这些规则或变化很大.我没有看到任何专门引用GUI元素的Microsoft指南,而不仅仅是普通变量,甚至是在控制台应用程序之外应用的示例.

在GUI中命名元素的最佳实践是什么?

c# user-interface naming-conventions winforms

69
推荐指数
4
解决办法
4万
查看次数

从UI线程强制GUI更新

在WinForms中,如何从UI线程强制立即更新UI?

我正在做的大致是:

label.Text = "Please Wait..."
try 
{
    SomewhatLongRunningOperation(); 
}
catch(Exception e)
{
    label.Text = "Error: " + e.Message;
    return;
}
label.Text = "Success!";
Run Code Online (Sandbox Code Playgroud)

在操作之前,标签文本未设置为"Please Wait ...".

我使用另一个线程进行操作解决了这个问题,但它变得毛茸茸,我想简化代码.

c# multithreading winforms

69
推荐指数
5
解决办法
11万
查看次数

用户控制 - 自定义属性

我在Visual Studio中开发了一个用户控件(WinForms C#)并且有一个问题.

我需要我的用户控件的用户能够更改某些字符串值,我希望他们能够将用户控件添加到他们的表单并单击它以显示我的用户控件的自定义属性将在其中的属性窗格显示.

如何为用户控件设置自己的自定义属性?例如:

我的用户控件包含一个TextBox,我希望用户能够通过Design-Time属性中名为"Text"或"Value"的属性更改该TextBox的值.

c# user-controls properties winforms

69
推荐指数
3
解决办法
9万
查看次数

删除Windows窗体中的标题栏

如何删除窗体顶部的蓝色边框?(我完全不知道它的名字.)

.net c# winforms

69
推荐指数
6
解决办法
14万
查看次数

是否可以像在WebView中一样在Windows窗体中嵌入Gecko或Webkit?

我很想知道是否有像Gecko.NET这样的东西;)我的意思是,就像我们可以嵌入一个WebView,这是任何Windows窗体应用程序中的IE7"实例"(并告诉它navigateto(fancy_url);).我喜欢使用Firefox或WebKit.

有人试过吗?

更新:请记住,虽然可以使用上述控件嵌入Gecko,但使用Gecko时仍然无法打印.

更新2010年3月:仍然无法使用GeckoFX本地打印,但是根据您尝试做的事情,存在一些可能已经足够的方法.有关详细信息,请参阅:http://geckofx.org/viewtopic.php?id = 796.

更新2013年10月:我不再进行Windows开发,所以我对此没有兴趣,但似乎可以在这里找到Gecko的开发:https://bitbucket.org/geckofx,它似乎最近更新了.将此留给未来的Windows开发人员;)

更新2017年1月:我收到了一家名为TeamDev的公司的电子邮件.他们创建了一个名为"DotNetBrowser"的基于Chromium的.NET浏览器组件,可用于在Windows窗体应用程序中显示现代网页.

直接引用电子邮件:

以下是有关该组件的一些详细信息,可能会有所帮助:

  1. DotNetBrowser基于Chromium,因此支持HTML5,CSS3,JS和最新的Web标准.库的基础Chromium版本会定期更新.
  2. 该组件适用于WPF以及Windows Forms桌面应用程序,适用于C#和VB.NET.
  3. 该图书馆是商业许可的,但是为开源和学术项目提供免费许可.

免责声明: 我没有使用过这个DotNetBrowser,因为我不再进行Windows开发,但如果您正在寻找解决方案,可能值得一试.

.net c# gecko webkit winforms

68
推荐指数
4
解决办法
9万
查看次数

表单没有响应KeyDown事件

我已经在我的Windows Forms项目上工作了一段时间,我决定尝试使用键盘快捷键.经过一些阅读后,我想我必须编写一个事件处理程序并将其绑定到表单的KeyDown事件:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.Alt && e.KeyCode == Keys.O)
    {
        MessageBox.Show("Ctrl+Alt+O: magic!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做是打开Visual Studio设计器的Properties面板的好方法,然后双击我的表单的KeyDown事件来生成Form1_KeyDown事件处理程序.但在测试我的应用程序时,表单根本不响应Ctrl+ Alt+ O键盘快捷键.Visual Studio设计器确实生成了将事件处理程序绑定到表单的代码:

private void InitializeComponent()
{
    // ...

    this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Form1_KeyDown);

    // ...
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试添加一个Console.WriteLine()对处理程序的调用来检查它是否被调用,但也没有运气.

此外,我试图在事件绑定调用上设置一个断点(如上所示),并发现程序到达该断点就好了.但是我从未在方法定义中设置任何断点.

为了确保我正确地执行了前几个步骤,我尝试重复它们:

  • 同一解决方案中的新表单.
    同样的问题:当我按下Ctrl+ Alt+ O键盘快捷键并且调试器甚至没有进入事件处理程序时,表单没有响应. 再次尝试这一点,它的工作原理.

  • 全新的WinForms解决方案.
    它完美运行:出现消息对话框(Console.WriteLine()调用也有效).

所以我在这里迷失了.是什么阻止了这个项目中的所有表单接收KeyDown事件?

.net c# winforms

68
推荐指数
3
解决办法
9万
查看次数

如何设置TcpClient的超时?

我有一个TcpClient,我用它来发送数据到远程计算机上的监听器.远程计算机有时会打开,有时会关闭.因此,TcpClient将无法经常连接.我希望TcpClient在一秒钟后超时,因此它无法连接到远程计算机时花费太多时间.目前,我将此代码用于TcpClient:

try
{
    TcpClient client = new TcpClient("remotehost", this.Port);
    client.SendTimeout = 1000;

    Byte[] data = System.Text.Encoding.Unicode.GetBytes(this.Message);
    NetworkStream stream = client.GetStream();
    stream.Write(data, 0, data.Length);
    data = new Byte[512];
    Int32 bytes = stream.Read(data, 0, data.Length);
    this.Response = System.Text.Encoding.Unicode.GetString(data, 0, bytes);

    stream.Close();
    client.Close();    

    FireSentEvent();  //Notifies of success
}
catch (Exception ex)
{
    FireFailedEvent(ex); //Notifies of failure
}
Run Code Online (Sandbox Code Playgroud)

这对于处理任务非常有效.如果可以,它会发送它,如果它无法连接到远程计算机,则捕获异常.但是,当它无法连接时,抛出异常需要十到十五秒.我需要它在大约一秒钟内超时?我怎样才能改变超时时间?

c# networking tcpclient winforms

68
推荐指数
5
解决办法
8万
查看次数