在我的 C# Win 应用程序中打开 Windows 的计算器?

Posted

技术标签:

【中文标题】在我的 C# Win 应用程序中打开 Windows 的计算器?【英文标题】:Open Windows' Calculator in my C# Win Application? 【发布时间】:2011-05-06 01:15:58 【问题描述】:

我知道我可以使用以下代码打开 Windows 计算器:

System.Diagnostics.Process.Start("calc");

但我想在我的 C# Win 应用程序中打开它,即:我不想在独立窗口中打开它,我想在我的窗口中打开它。 我该怎么做?

【问题讨论】:

【参考方案1】:

MS Windows Calculator 不是一个 GUI 控件,它是一个独立的应用程序。如果您正在寻找 .NET 计算器控件,则有一些来自第三方供应商的商业控件,例如

这里

http://download.cnet.com/Softgroup-Net-Calculator-Control/3000-10250_4-10909672.html

或者这里

http://www.softpedia.com/get/Programming/Components-Libraries/Net-Calculator-Control.shtml

【讨论】:

【参考方案2】:

您不能在表单中嵌入其他应用程序。

但是,您可以将计算器窗口移动到表单顶部并将您的表单设置为其父级。这可能会实现您正在寻找的视觉效果。您可以查看SetParent API 函数。例如:

System.Diagnostics.Process p = System.Diagnostics.Process.Start("calc.exe");
p.WaitForInputIdle();
NativeMethods.SetParent(p.MainWindowHandle, this.Handle);

如果您确实需要在您的应用程序中嵌入该功能,更好的解决方案可能是在 C# 中滚动您自己的计算器控件。将一个简单的计算器组合在一起真的一点也不难,而且它可以无限定制,完全按照您的意愿进行操作和外观。

如果您想推出自己的计算器,也许这样的东西会是一个很好的起点:http://www.codeproject.com/KB/cs/Scientific_Calculator.aspx

而且我一直认为,如果我曾经编写过一个严重依赖数字输入的应用程序,这种类型的控件有一天会非常有用:http://www.codeproject.com/KB/miscctrl/C__Popup_Calculator.aspx

【讨论】:

计算器将在独立窗口中打开。 @aliboy38 是的,当然会。我在哪里说过其他话? 我以为它会在winform中打开。因为问题是如何在 C# win 中打开它,并且您的答案标记为答案。顺便说一句,您使用了 SetParent 和 MainWindowHandle。那么您的答案和问题之间有什么区别,因为该代码也会显示计算器。谢谢 @aliboy38 我偷偷怀疑你从未真正阅读过我的全部答案,而只是查看了代码块。答案以 “您不能将另一个应用程序嵌入到您的表单中”这一行开头。 这基本上是在说“您在问题中要求的内容是不可能的。”然后,我继续提供一个公认的 hackish 解决方法——将计算器窗口重新设置为应用程序窗口的父级。您可以通过调用 SetParent 函数来实现这一点,该函数是我在代码块之前的段落中链接到的文档。 是的,Process.Start 是一样的。这不是答案的重点。答案的重点是SetParent 函数。【参考方案3】:

你可以pinvoke SetParent(),子窗口句柄应该是Calc的Process.MainWindowHandle,父窗口应该是你要嵌入它的窗口句柄。 Form.Handle 为您提供了该值。您还需要 MoveWindow 才能将窗口放在正确的位置。使用 pinvoke.net 获取所需的 pinvoke 声明。

【讨论】:

您能否发布一个示例代码以便更好地理解?谢谢 Google +setparent +mainwindowhandle 并获得第一击。 SDK 文档中的什么地方声明子窗口必须属于同一个进程? @hans passant:你有网址吗?这里没有关于进程的内容:msdn.microsoft.com/en-us/library/ms633541(VS.85).aspx @jonsb - 找不到。这似乎已经改变,SetWindowLongPtr 的文档现在只提到了对 XP 的限制,并且直接不再使用 GWLP_HWNDPARENT。我会相应地进行编辑。【参考方案4】:
using System.Diagnostics;

try
     
         Process p = null;
         if (p == null)
          
            p = new Process();
            p.StartInfo.FileName = "Calc.exe";
            p.Start();
          
         else
             
                p.Close();
                p.Dispose();
             
         
        catch (Exception e)
            
                MessageBox.Show("Excepton" + e.Message);
            
     

【讨论】:

【参考方案5】:

试试下面;为我跑。

    using System.Diagnostics;

    private void button1_Click(object sender, EventArgs e) 

      
        string filename= "calc.exe";

        Process runcalc= Process.Start(filename);

        while (runcalc.MainWindowHandle == IntPtr.Zero)
        

            System.Threading.Thread.Sleep(10);

            runcalc.Refresh();

        
    

【讨论】:

【参考方案6】:
System.Diagnostics.Process.Start("calc.exe");

【讨论】:

以上是关于在我的 C# Win 应用程序中打开 Windows 的计算器?的主要内容,如果未能解决你的问题,请参考以下文章

c#如何关联多个文件

请求 UAC 海拔 c#

我的 C# win 表单应用程序在内部调用批处理脚本,如何在 Visual Studio 中导出时对最终用户隐藏它?

在我的 c# 项目中备份我的 /Data 文件夹

BHO 和服务之间的 C# IPC

C++ Win32 中的 C# DateTime.ToUniversalTime() [关闭]