10

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

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

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

4

6 回答 6

14

您不能将其他应用程序嵌入到您的表单中。

但是,您可以将计算器窗口移动到表单顶部并将您的表单设置为其父级。这可能会实现您正在寻找的视觉效果。您可以检查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

于 2010-11-06T15:44:48.470 回答
5

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

于 2010-11-06T15:41:19.503 回答
5

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

于 2010-11-06T16:03:25.093 回答
2

试试下面; 为我跑。

    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();

        }
    }
于 2016-09-09T06:37:14.750 回答
2
System.Diagnostics.Process.Start("calc.exe");
于 2018-04-14T07:07:53.270 回答
1
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);
            }
     }
于 2016-06-27T11:38:34.283 回答