TatsuSheva Ответов: 1

C#: поместите exe-файл на передний план формы


Здравствуйте, мне нужно, чтобы окно exe (например, блокнот) всегда было на переднем плане формы , это означает, что даже если мы нажмем на форму, окно exe всегда будет впереди формы.Другими словами, у меня есть кнопка, которая, когда мы нажимаем на нее, запускает exe-файл, и появляется окно exe-файла. Если мы нажмем на форму, окно exe-файла должно остаться на своем месте.
Вот что я сделал:

Process myProcess = new Process();

           try
           {
               this.TopMost = false;
               string winpath = Environment.GetEnvironmentVariable("windir");
               myProcess.StartInfo.UseShellExecute = false;
               myProcess.StartInfo.FileName = winpath+@"\system32\notepad.exe";


               myProcess.Start();


           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }


Что я уже пробовал:

Я могу запустить exe-файл, но не могу держать его на переднем плане.
Спасибо.

1 Ответов

Рейтинг:
10

0x01AA

Вы можете использовать сервис interop для решения вашего запроса.

using System.Runtime.InteropServices;

public partial class FormMain : Form
{
    //
    // WINAPI definitions, copeied from windows.h
    enum SetWinPos_ZOrderOpt{HWND_TOP        = 0,
                                HWND_BOTTOM     = 1,
                                HWND_TOPMOST    = -1,
                                HWND_NOTOPMOST  = -2}
    enum SetWinPosFlags
    {
        SWP_NOSIZE = 0x0001,
        SWP_NOMOVE = 0x0002,
        SWP_NOZORDER = 0x0004,
        SWP_NOREDRAW = 0x0008,
        SWP_NOACTIVATE = 0x0010,
        SWP_FRAMECHANGED = 0x0020, /* The frame changed: send WM_NCCALCSIZE */
        SWP_SHOWWINDOW = 0x0040,
        SWP_HIDEWINDOW = 0x0080,
        SWP_NOCOPYBITS = 0x0100,
        SWP_NOOWNERZORDER = 0x0200, /* Don't do owner Z ordering */
        SWP_NOSENDCHANGING = 0x0400, /* Don't send WM_WINDOWPOSCHANGING */
        SWP_DRAWFRAME = SWP_FRAMECHANGED,
        SWP_NOREPOSITION = SWP_NOOWNERZORDER
    }

    //
    // Import SetWindowPos
    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    public static extern IntPtr SetWindowPos(int hWnd, int hWndInsertAfter,
                                             int X, int Y, int cx, int cy,
                                             uint flages);

    // Start Notepad and set TOOPMOST
    private void buttonTestTopLevel_Click(object sender, EventArgs e)
    {
        Process myProcess = new Process();
        try
        {
            this.TopMost = false;
            string winpath = Environment.GetEnvironmentVariable("windir");
            myProcess.StartInfo.UseShellExecute = false;
            myProcess.StartInfo.FileName = winpath + @"\system32\notepad.exe";	// See Note 1
            myProcess.Start();
            myProcess.WaitForInputIdle();
            {
                // Here HWND_TOPMOST does it's Job
                SetWindowPos(myProcess.MainWindowHandle.ToInt32(), 
                                (int)SetWinPos_ZOrderOpt.HWND_TOPMOST,
                                0, 0, 0, 0,
                                (int)(SetWinPosFlags.SWP_NOSIZE |
                                      SetWinPosFlags.SWP_NOMOVE | 
                                      SetWinPosFlags.SWP_SHOWWINDOW));
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    // ...
}


Примечание 1:
Здесь вы можете столкнуться с проблемами, если ваше приложение 32-битное, а Win-64-битное.

Надеюсь, это поможет.


TatsuSheva

Спасибо, вы спасли мне жизнь.

0x01AA

Добро пожаловать.

0x01AA

-

TatsuSheva

На самом деле мой выигрыш 64-битный, но он отлично работает.

0x01AA

Да, это работает, если все сходится. Я предполагаю,что в настройках Вашего проекта вы сняли флажок "32-битный предпочтительный", так что все в порядке. Если вы установите этот флажок, то ваше приложение будет работать как 32-битное и вызовет проблемы с приведенным выше примером. Тогда обходной путь состоит в том, чтобы начать Notepad.exe от C:\Windows\SysWOW64 где находится 32-битная версия Блокнота.

TatsuSheva

Ладно, спасибо.

TatsuSheva

Я попытался открыть Word, поставив WINWORD.EXE он показывает мне ошибку x)

0x01AA

Что именно является сообщением об ошибке?

TatsuSheva

указанный файл неизвестен
Я просто должен был положить путь

0x01AA

И действительно ли он показывает его как самый верхний? Когда я пытаюсь это сделать, это не происходит, если только я не делаю нить.Sleep (200) перед SetWindowsPos.

TatsuSheva

Здравствуйте, вы пробовали воспользоваться калькулятором ? Это работает с вами ?

0x01AA

Привет, у меня это не работает :(

TatsuSheva

Есть решение ?

TatsuSheva

?????

0x01AA

Извините, понятия не имею...