2015-12-11 112 views
1

我使用的示例代碼打獵過程中我的Windows窗體應用程序從具體名單運行C#程序中其他應用程序與他的孩子的

void processStartEvent_EventArrived(object sender, EventArrivedEventArgs e) 
{ 
    string processName = e.NewEvent.Properties["ProcessName"].Value.ToString(); 
    int processID = Convert.ToInt32(e.NewEvent.Properties["ProcessID"].Value); 

    if (_processNames.Contains(processName)) 
    { 
     Process proc = Process.GetProcessById(processID); 
     if (GlobalVar.SourceWinForm.InvokeRequired) 
     { 

      GlobalVar.SourceWinForm.Invoke(new MethodInvoker(delegate { ProcessHandler.SetParent(proc.MainWindowHandle, GlobalVar.SourceWinForm.Handle); })); 
     } 
     else 
     { 
      ProcessHandler.SetParent(proc.MainWindowHandle, GlobalVar.SourceWinForm.Handle); 
     } 
    } 

} 

,你可以看到我使用的功能:

[DllImport("user32.dll")] 
public static extern IntPtr SetParent(IntPtr hwc, IntPtr hwp); 

除了一件事情,一切都很好。 例如,我將記事本應用程序捕獲到我的應用程序中。 所以它真的給我的記事本到我的應用程序窗口,但問題開始時,我按例如記事本「格式 - >字體」它打開記事本,這個子窗口的新子窗口,我apllication不是父親這個子窗口。

我怎麼可以追捕整個過程?包括他的孩子(子)窗戶?

+3

如果你是**你的兒子的父親**那麼你不能也**他的兒子的父親**。一般而言,您可以重新監視您監控表單的每個子窗口,但必須通過輪詢(列舉子項)來執行此操作,並且還可能會中斷目標應用程序。退後一步。你爲什麼需要它? –

+1

我做了一個KIOSK應用程序。我的應用程序阻止了窗口中的每一件事情,當他保護用戶執行除了我的應用程序之外的其他活動時,我只向用戶提供一個他可以使其運行和使用的程序。所以我希望這個用戶只會使用一個應用程序而不需要到桌面以外。 –

+2

這不是製作自助服務終端應用程序的方法......您必須用您自己的應用程序(它是註冊表設置)替換默認的外殼程序,並使用策略和權限來確定用戶可以做什麼(或不能做什麼)。它與其他應用程序更兼容,當然更安全。 –

回答

1

你可以使用:

[DllImport("user32.dll")] 
    private static extern 
     bool SetForegroundWindow(IntPtr hWnd); 
    [DllImport("user32.dll")] 
    private static extern 
     bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
    [DllImport("user32.dll")] 
    private static extern 
     bool IsIconic(IntPtr hWnd); 

和那麼

  // bring it to the foreground 
      if (IsIconic(proc.MainWindowHandle)) 
       ShowWindowAsync(proc.MainWindowHandle, SW_RESTORE); 
      SetForegroundWindow(proc.MainWindowHandle); 
0

解決方案: 首先,我想說的評論是正確的,可以幫助別人,所以請首先閱讀我的主要問題的意見。

但是,如果您有特定的情況,並且您沒有任何其他選項,並且您必須使用SetParent或其他類似的功能。 (確保你第一次讀到的setparent,你明白它的劑量)

的解決辦法是把整個表格前景:

bool SetForegroundWindow(IntPtr hWnd); 

這使所有其他形式從主窗體你繼承裝載看到它在你的主應用程序(在這種情況下,你的應用程序塊和streach整個屏幕)

相關問題