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

时间:2010-11-06 15:36:02

标签: c# .net windows-7 system.diagnostics calculator

我知道我可以使用以下代码打开Windows Calculator:

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

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

6 个答案:

答案 0 :(得分:12)

您无法在表单中嵌入其他应用程序。

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

答案 1 :(得分: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

答案 2 :(得分:5)

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

答案 3 :(得分: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);
            }
     }

答案 4 :(得分:1)

尝试以下;为我而战。

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

        }
    }

答案 5 :(得分:1)

    StringBuffer sb=new StringBuffer("nitin");
    String before = sb.toString();
    sb.reverse();
    String after = sb.toString();
    System.out.println(before);
    System.out.println(after);
    System.out.println(before == after);
    if(before.equals(after)){
        System.out.println("true");
    }else{
        System.out.println("false");
    }