2015-10-29 4 views
1

хорошие ребята, может кто-нибудь мне помочь. У меня есть winforms, который устанавливает TopMost = true. И у меня есть кнопка, когда я нажимаю на нее, она создает блокнот. Теперь я хочу, чтобы мой блокнот показывал в верхней части моих winforms без, устанавливая мои winforms TopMost = false. Может быть, я что-то упустил. Я открыт для любых предложений. Кстати, я установил свою форму в TopMost=true и BringToFront(), потому что я не хочу, чтобы любой пользователь выбирал любую программу на панели задач и выводил ее на передний план и сворачивал мои winforms. Заранее спасибоблокнот на вершине winform

public Form1() 
{ 
    InitializeComponent(); 
    this.BringToFront(); 
    this.TopMost = true; 
} 

// bunch of codes here... 

private void button1_Click(object sender, EventArgs e) 
{ 
    Process process = new Process(); 
    process.StartInfo.FileName = "notepad.exe"; 
    process.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
    process.Start(); 

} 

// some codes here 

private void Form1_Load(object sender, EventArgs e) 
{ 
    FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; 
    Left = Top = 0; 
    Width = Screen.PrimaryScreen.WorkingArea.Width; 
    Height = Screen.PrimaryScreen.WorkingArea.Height; 
} 
+0

Пробовал 'метод SendToBack' еще? – kevintjuh93

+0

Единственный вариант, который я вижу, - это получить обработчик главного дескриптора NotePad: 'process.MainWindowHandle', а затем через' GetWindowLong' и 'SetWindowLong' добавить' WS_EX_TOPMOST' расширенный стиль окна к нему –

+0

@ kevintjuh93 попробовал это сейчас, блокнот впереди теперь, но winform находится на обратной стороне моего браузера (открывается, прежде чем я запустил приложение) – jLaw

ответ

2

PInvoke решение:

using System.Runtime.InteropServices; 
... 

// Even if it is "user32.dll" it will do on IA64 as well 
[DllImport("user32.dll", SetLastError = true)] 
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, 
           int X, int Y, int cx, int cy, int uFlags); 

... 

// Since Process is IDisposable, put it into "using" 
using (Process process = new Process()) { 
    process.StartInfo.FileName = "notepad.exe"; 
    process.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
    process.Start(); 

    // wait for main window be created 
    process.WaitForInputIdle(); 

    // Insert (change Z-order) as the topmost - (IntPtr) (-1); 
    // NoMove, NoSize - 0x0002 | 0x0001 
    SetWindowPos(process.MainWindowHandle, (IntPtr) (-1), 0, 0, 0, 0, 0x0002 | 0x0001); 
} 
+0

Ух ты .. это работает именно то, что я хотел ... Спасибо. – jLaw

Смежные вопросы