获取隐藏表单的句柄

时间:2009-07-31 11:58:51

标签: c# windows

我有一个控制台应用程序(SRMan.exe),它源自System.Windows.Forms.Form。我可以在exe运行时隐藏表单。我用过的代码就在这里

    this.Opacity = 0;
    this.Size = new Size(0, 0);
    this.Location = new Point(-100, -100);
    this.Visible = false;

Aslo,将表单属性ShowIconShowInTaskbar配置为false。

但是我无法获得正在运行的process.code的Window句柄。我使用的是

Process[] process1 = Process.GetProcessesByName("SRMan");
IntPtr pt = process1[0].MainWindowHandle;

感谢任何帮助!

谢谢,
卡里姆。

2 个答案:

答案 0 :(得分:2)

你在什么时候打电话:

Process[] process1 = Process.GetProcessesByName("SRMan");
IntPtr pt = process1[0].MainWindowHandle;
如果尚未创建主窗口句柄,

pt将返回为零或“MainWindowHandle”可能会抛出异常。

尝试将代码更改为:

Process[] process1 = Process.GetProcessesByName("SRMan");
process1[0].WaitForInputIdle();
IntPtr pt = process1[0].MainWindowHandle;

因为这会强制您的代码等待进程完全加载。 (MSDN article)

举个例子,下面的代码对我来说很好用:

 private Thread thd;

 private void Form1_Load(object sender, EventArgs e)
 {            
     thd = new Thread(new ThreadStart(GetHandle));
     thd.Start();
     this.Opacity = 0;
     this.Size = new Size(0, 0);
     this.Location = new Point(-100, -100);
     this.Visible = false;
 }

 private void GetHandle()
 {
     Process[] process1 = Process.GetProcessesByName("WindowsFormsApplication12.vshost");
     process1[0].WaitForInputIdle();
     IntPtr pt = process1[0].MainWindowHandle;
     MessageBox.Show(pt.ToString());
 }

答案 1 :(得分:0)

你有什么理由不能从表单的Handle属性中获取句柄吗? 任何派生自Control类的东西都有Handle属性。

你为什么要从过程中抓住它?