小编and*_*l85的帖子

C# - 如何使两个表单相互引用

我在MS Visual C#中编写了一个WindowsForms应用程序,我需要两种形式才能相互引用.在我测试时,我在Form1上创建了两个按钮 - 一个按钮显示Form2,另一个按钮隐藏它(代码在下面).

我想对Form2做同样的事情 - 创建隐藏或显示Form1的两个按钮.我使用了与Form1相同的方法,但是当我编译应用程序时,似乎陷入无限循环并且我收到了StackOverflow消息.

如何更改代码以便两个表单能够互相引用?

Form1代码:

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
    Form2 frm2;
    public Form1()
    {
        InitializeComponent();
        frm2 = new Form2();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        frm2.Visible = false;
    }

    private void button2_Click(object sender, EventArgs e)
    {
        frm2.Visible = true;
    }
}
}
Run Code Online (Sandbox Code Playgroud)

Form2代码:

namespace WindowsFormsApplication1
{
public partial class Form2 : Form
{
    Form1 frm1;
    public Form2()
    {
        InitializeComponent();
        frm1 = new Form1();
    }

    private void button1_Click(object …
Run Code Online (Sandbox Code Playgroud)

c# winforms

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

当完整路径解析为64位目录时,无法从32位C#应用程序启动快捷方式(lnk)文件

我正在尝试从C#应用程序启动"开始"菜单中的程序,并且"开始"菜单中的几乎所有项目都是快捷方式(lnk)文件.当使用Process.Start启动这些文件时,如果lnk文件的完整路径指向C:\ Program Files目录,我发现我收到"系统无法找到指定的路径"错误.我在Windows中对文件系统重定向进行了一些研究,所以我尝试禁用它,但我仍然得到同样的错误:

// disable file system redirection:
IntPtr ptr = new IntPtr();
bool isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr);
// run the file:
System.Diagnostics.Process.Start("c:\\splitter.lnk");
Run Code Online (Sandbox Code Playgroud)

这将返回"系统找不到指定的路径".但是,如果我从"开始">"运行"对话框启动c:\ splitter.lnk,则程序运行正常.您可以通过为任何64位应用程序创建快捷方式,将其放在C驱动器上,并尝试使用上面的代码运行它来在任何64位计算机上重现此问题.

是否有更好的方法来启动.lnk文件以避免此问题?或者我没有正确禁用文件重定向?

编辑:我也尝试将UseShellExecute设置为true以使操作系统运行该文件,但仍然失败,这很有趣,因为从开始>运行对话框运行相同的路径工作正常:

Process process = new Process();
process.StartInfo.UseShellExecute = true;
process.StartInfo.FileName = "c:\\splitter.lnk";
process.Start();
Run Code Online (Sandbox Code Playgroud)

编辑2:我认为不是直接尝试启动LNK文件,而是获取目标,然后运行目标.我尝试使用如何在c#中解析.lnk以及如何以编程方式跟踪.lnk文件,但这两种方法都返回完整路径为C:\ Program Files(x86)\ Splitter.exe而不是C:\的实际路径Program Files\Splitter.exe.

也许我可以使用上述方法之一来获取LNK文件的目标.然后我可以看到目标是否包含Program Files(x86).如果是,请将其替换为Program Files并检查文件是否存在.如果它存在于Program Files中,请运行它.如果没有,请从Program Files(x86)位置运行该文件.这将是一个混乱的解决方法,但我不知道还有什么可以尝试.任何建议,将不胜感激.

c# windows process.start winforms

4
推荐指数
1
解决办法
2265
查看次数

标签 统计

c# ×2

winforms ×2

process.start ×1

windows ×1