TatsuSheva Ответов: 3

Скрытие и отображение окна exe(MS word, excel и т. д.) В C#


Здравствуйте, я делаю приложение на c#, и в моем приложении я открываю какой-то exe-файл, например MS word, калькулятор, поэтому, когда я открываю приложение, а затем скрываю его, я хотел бы создать своего рода ярлык в приложении, чтобы при нажатии на shotcut окно снова открывалось.

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

Что я сделал, так это то, что мне удалось поместить окно exe-файла на самый верх, но когда оно скрыто или изменено, я хотел бы создать ярлык в приложении на C#, чтобы при нажатии на shorcut exe-файл снова открывался.
Спасибо.

3 Ответов

Рейтинг:
18

NaibedyaKar

Вот как вы можете проверить, свернуто ли окно, а затем восстановить его.

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        var processes = Process.GetProcessesByName("winword");
        foreach (var p in processes)
        {
            MaximizeWindowIfMinized(p.MainWindowTitle);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}


[DllImportAttribute("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImportAttribute("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[DllImportAttribute("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool IsIconic(IntPtr hWnd);

public static void MaximizeWindowIfMinized(string windowName)
{
    try
    {
        var instance = FindWindow(null, windowName);

        if (IsIconic(instance))
        {
            MessageBox.Show(@"Window is minimized");

            ShowWindow(instance, 1);
            SetForegroundWindow(instance);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}


[no name]

Боже мой. Сколько раз вы должны отвечать на один и тот же вопрос? Эти бесполезные интернет-точки должны действительно что-то значить для вас.

TatsuSheva

Я должен поставить его на таймер ?

TatsuSheva

Когда я компилирую, ничего не происходит, даже если я ставлю его на таймер.

Рейтинг:
1

NaibedyaKar

Можете ли вы попробовать ниже. Теперь я проверил его, и он работает нормально.

[DllImportAttribute("user32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImportAttribute("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[DllImportAttribute("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

public static void ShowToFront(string windowName)
{
    try
    {
        IntPtr firstInstance = FindWindow(null, windowName);
        ShowWindow(firstInstance, 1);
        SetForegroundWindow(firstInstance);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

}


Вы должны вызвать функцию с полным именем приложения, которое вы хотите восстановить. (точно так же, как показано на вкладке диспетчер задач windows-приложение). Вы можете получить это имя из процесса.MainWindowTitle. Проверьте приведенное ниже событие..

private void button1_Click(object sender, EventArgs e)
        {
            try
            {

                Process[] Processes = Process.GetProcessesByName("winword");
                
                foreach (Process p in Processes)
                {
                    ShowToFront(p.MainWindowTitle);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }


TatsuSheva

Мне нужно проверить , свернуто ли окно, поэтому создается кнопка, а затем, когда мы нажимаем на кнопку, окно восстанавливается.

TatsuSheva

То, что вы мне дали, является правильным, но как я могу проверить, свернуто ли окно ? Потому что я хочу создать кнопку динамически, когда окно свернуто.

NaibedyaKar

Извините за поздний ответ, я был занят кое-чем другим.
Вы можете использовать IsIconic(экземпляр), чтобы узнать, минимизировано ли приложение или нет. Позвольте мне показать весь код как отдельный ответ.

Рейтинг:
1

Data4marketers Inc

Hey guys, i've tried something like this... and the problem was that I had no control over the overall System Wide applications.... when I tried using the following:

<pre>           List<Form> oForms = new List<Form>();
                
                foreach (Form form in Application.OpenForms)
                {
                    MessageBox.Show("form.text");
                    MessageBox.Show(form.Text);
                    oForms.Add(form);
                }
                foreach (var form in oForms)
                {
                    //MessageBox.Show("form.text");
                    //MessageBox.Show(form.Text);
                    form.Hide();
                }


приложение.OpenForms" всегда был просто чем-то, что применялось к приложению, над которым я работал... Он не будет охватывать ничего другого, что было открыто на экране, например "CALC", "NOTEPAD", "IEXPLORE" и т. д... Я попробовал несколько вещей, и он будет отображать только название моего приложения в "закомментированных" мессенджерах... Может быть, есть еще одна переменная типа C# 'Global', которую я должен использовать вместо этого...?

Заранее спасибо ребята,


Richard MacCutchan

Это не ответ на вышеприведенный вопрос. Если у вас есть проблема, то, пожалуйста, откройте новый вопрос.