2013-08-17 19 views
0

我試過這樣做,並以下面的代碼結束;在另一個進程頂部顯示錶單模式

 var proc = Process.GetProcesses().Where(x => x.ProcessName == "notepad").First(); 
     IWin32Window w = Control.FromHandle(proc.MainWindowHandle); 

     using (Form2 frm = new Form2()) 
     { 
      frm.ShowDialog(w); 
     } 

但是,這並不顯示窗體作爲「記事本」之上的模式,出於某種原因,爲什麼? 我想實現的是:能夠在記事本上顯示模式。謝謝!

+0

可能重複(http://stackoverflow.com/questions/18286709/showdialog-on-top-另一個進程) – Sayse

+4

編輯你現有的問題,而不是一個新的問題 – Sayse

回答

2

Control.FromHandle將在另一個進程中創建的窗口返回null。

所以當致電frm.ShowDialog(w);時,你實際上是在通過null,因此你的表格不是Notepad's window

public class Win32WindowWrapper : IWin32Window 
{ 
    private IntPtr handle; 
    public Win32WindowWrapper(IntPtr handle) 
    { 
     this.handle = handle; 
    } 
    public IntPtr Handle 
    { 
     get { return handle; }     
    } 
} 

using (Form2 frm = new Form2()) 
{ 
    frm.ShowDialog(new Win32WindowWrapper(proc.MainWindowHandle)); 
} 

這應該工作

0

你需要轉換的IntPtr到IWin32Window,但要做到這一點,你有義務使用的包裝。這裏的樣本源代碼:

public class WindowWrapper : System.Windows.Forms.IWin32Window 
{ 
    public WindowWrapper(IntPtr handle) 
    { 
     _hwnd = handle; 
    } 

    public IntPtr Handle 
    { 
     get { return _hwnd; } 
    } 

    private IntPtr _hwnd; 
} 

Process[] procs = Process.GetProcessesByName("Notepad"); 
if (procs.Length != 0) 
{ 
    IntPtr hwnd = procs[0].MainWindowHandle; 
    MessageBox.Show(new WindowWrapper(hwnd), "Hello World!"); 
} 
else 
    MessageBox.Show("Notepad is not running."); 

來源:[ηShowDialog的另一過程的頂] http://ryanfarley.com/blog/archive/2004/03/23/465.aspx

相關問題