2012-01-16 26 views
6

我使用Process.Start()從我的程序中打開了一個記事本,但新打開的記事本覆蓋了屏幕。但我確實希望我的應用程序能夠保持其重點。如何在打開過程(記事本)後將焦點設置回窗體?

我類似(使用相同的Process.Start)打開MS Excel和Word,但讓焦點回到我的形式,我需要寫的是:

this.Focus(); 

但是用記事本怪癖:我打開記事本(以及所有其他類似的過程)

Process process = new Process(); 
process.StartInfo.UseShellExecute = true; 
process.EnableRaisingEvents = true; 
process.StartInfo.FileName = @"abc.log"; 
process.Start(); 

現在記事本佔據了焦點。

我嘗試這些:

  1. this.Activate()this.Focus(),不用提

  2. [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)] 
    public static extern IntPtr SetFocus(HandleRef hWnd); 
    
    { 
        IntPtr hWnd = myProcess.Handle; 
        SetFocus(new HandleRef(null, hWnd)); 
    } 
    
  3. [DllImport("User32")] 
    private static extern int SetForegroundWindow(IntPtr hwnd); 
    
    [DllImportAttribute("User32.DLL")] 
    private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
    private const int SW_SHOW = 5; 
    private const int SW_MINIMIZE = 6; 
    private const int SW_RESTORE = 9; 
    
    { 
        ShowWindow(Process.GetCurrentProcess().MainWindowHandle, SW_RESTORE); 
        SetForegroundWindow(Process.GetCurrentProcess().MainWindowHandle); 
    } 
    
  4. 另一個更長的解決方案,從here了。

所有這些仍然把重點放在記事本上。爲什麼僅僅把焦點放在一個窗口上太難了,應用程序自己的窗口也是如此?

編輯:至多我可以打開記事本最小化,但它仍然不會在嘗試所有上述代碼後將焦點放在窗體上。記事本打開時最小化,但重點仍然放在記事本上(有時我們在Windows XP中看到的東西),而形式將會失去重點。

+0

它是確定啓動窗口處於最小化狀態? – NoviceProgrammer 2012-01-16 14:14:16

+0

是的,沒關係,但它仍然不起作用。我會在我的問題中更新 – nawfal 2012-01-16 14:14:57

+0

你試過這個嗎? http://stackoverflow.com/questions/2121911/starting-a-process-without-stealing-focus-c – NoviceProgrammer 2012-01-16 14:17:37

回答

9

我嘗試了幾乎所有的互聯網(所以肯定:) :))。充其量,我可以在所有其他形式之上獲得我的表格,但沒有關注(通過@Hans Passant的方法)。通過大量的代碼遍歷,我不知何故會覺得這很簡單。所以我總是用SetForegroundWindow()與其他代碼塊。從來沒有想過只有SetForegroundWindow()會做到這一點。

這工作。有時這個方法產生一個重點放在父窗體上(在我希望的窗體是它的父窗體的一個模態子窗體的情況下);在這種情況下,只需添加this.Focus()到最後一行..

即使這樣的工作:通過here

2

我有同樣的問題,我最終清盤通過編程調用ALT標籤:

[DllImport("user32.dll")] 
static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam); 

private void alttab() 
{ 
    uint WM_SYSCOMMAND = 0x0112; 
    int SC_PREVWINDOW = 0xF050;    

    PostMessage(Process.GetCurrentProcess().MainWindowHandle, WM_SYSCOMMAND, SC_PREVWINDOW, 0); 
} 

//編輯:您應該使用process.MainWindowHandle代替ofcourse

+0

謝謝。明天會讓你知道..這絕對是不同的想法,但我擔心這個解決方法有時會產生問題。你有沒有遇到這種方法的問題? – nawfal 2012-01-16 16:27:13

+0

這是行不通的。 – nawfal 2012-01-18 06:41:35

1

Windows禁止推搡他們的應用程序窗口進入用戶的臉部,你看到了這個工作。 AllowSetForegroundWindow()的MSDN文檔中記錄了應用程序可能竊取焦點的確切規則。

此限制的後門是AttachThreadInput()函數。此代碼運行良好,我沒有找到擁有前臺窗口的線程的線程ID的快捷方式。記事本足夠好,可能不適用於其他應用程序。請小心Raymond Chen做的不是贊同這種黑客。

private void button1_Click(object sender, EventArgs e) { 
     var prc = Process.Start("notepad.exe"); 
     prc.WaitForInputIdle(); 
     int tid = GetCurrentThreadId(); 
     int tidTo = prc.Threads[0].Id; 
     if (!AttachThreadInput(tid, tidTo, true)) throw new Win32Exception(); 
     this.BringToFront(); 
     AttachThreadInput(tid, tidTo, false); 
    } 

    [DllImport("user32.dll", SetLastError = true)] 
    private static extern bool AttachThreadInput(int tid, int tidTo, bool attach); 
    [DllImport("kernel32.dll")] 
    private static extern int GetCurrentThreadId(); 
+0

謝謝。但我懷疑,如果BringToFront真的在這裏工作。這不僅僅是使控制在另一個控制之上可見的一種措施嗎?這不是嗎?激活是一個更好的選擇嗎? – nawfal 2012-01-16 16:33:49

+0

誰是雷蒙德?批准這個? :o – nawfal 2012-01-16 16:34:22

+0

Form.BringToFront()調用SetForegroundWindow(),通過試圖編碼很容易看到。 Raymond Chen是微軟程序員,擁有一個受歡迎的博客。帖子也在這裏回答,我不想讓他失望。 http://blogs.msdn.com/b/oldnewthing/ – 2012-01-16 16:36:52

-1

提供

Microsoft.VisualBasic.Interaction.Shell(@"notepad.exe D:\abc.log", 
             Microsoft.VisualBasic.AppWinStyle.NormalNoFocus); 

解決方法試試這個:

public partial class MainForm : Form 
{ 
    private ShowForm showForm; 

    public MainForm() 
    { 
     InitializeComponent(); 
    } 

    private void showButton_Click(object sender, EventArgs e) 
    { 
     this.showForm = new ShowForm(); 
     this.showForm.FormClosed += showForm_FormClosed; 
     this.showForm.Show(this); 
    } 

    private void showForm_FormClosed(object sender, FormClosedEventArgs e) 
    { 
     this.Focus(); 
    } 
} 
+0

這是如何回答這個問題的? – nawfal 2013-02-19 09:52:27

相關問題