1

重複の可能性:
アプリケーションウィンドウを前面に表示するにはどうすればよいですか?

SwitchToThisWindowに問題があります

using System;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace BringToFront
{
    public partial class Form1 : Form
    {
        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(String className, String windowName);

        [DllImport("user32.dll", SetLastError = true)]
        static extern void SwitchToThisWindow(IntPtr hWnd, bool turnOn);

        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

        IntPtr activeWindowHandle = GetForegroundWindow();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (!checkBox1.Checked)
                    bringToFront(comboBox1.SelectedItem.ToString());
                else
                    timer1.Enabled = true;
            }
            catch
            {
                MessageBox.Show("Please choose a Process Name");
            }
        }

        public static void bringToFront(string title)
        {
            IntPtr handle = FindWindow(null, title);
            if (handle == IntPtr.Zero)
            {
                return;
            }
            SwitchToThisWindow(handle, true);
        }

        private void comboBox1_Click(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            Process[] process = Process.GetProcesses();
            foreach (Process processes in process)
            {
                if (!String.IsNullOrEmpty(processes.MainWindowTitle))
                    comboBox1.Items.Add(processes.MainWindowTitle.ToString());
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Process process = Process.GetCurrentProcess();
            string title = process.ProcessName.ToString();
            IntPtr handle = FindWindow(null, title);

            if (activeWindowHandle != handle)
                bringToFront(comboBox1.SelectedItem.ToString());
            if (!checkBox1.Checked)
                timer1.Enabled = false;
        }
    }
}

ご覧のとおり、選択したプロセスを前面に移動し、5秒ごとにタイマーを実行して前面に戻すことで、プロセスを前面に保持しようとしています。Microsoft Visual Studiosを介してアプリケーションを実行する場合は完全に機能しますが、プログラムをスタンドアロンとして実行すると、このような他のすべての機能と同じように機能し、前面に表示するのではなく、タスクバーでフラッシュするだけです。

パーミッションが異なるのはなぜですか?これを修正する方法はありますか?

4

1 に答える 1

3

ここで@ReedCopsyによる解決策を介して、そのウィンドウに切り替えた後、選択したハンドルをTopMostにすることをお勧めします。このソリューションを使用すると、選択したウィンドウの上に新しいアプリを追加することはできません。

コードに以下を追加します。

 [DllImport("user32.dll")]
 static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

 static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
 const UInt32 SWP_NOSIZE = 0x0001;
 const UInt32 SWP_NOMOVE = 0x0002;
 const UInt32 SWP_SHOWWINDOW = 0x0040;

に呼び出しを追加して、bringToFrontを変更しますSetWindowPos

   public static void bringToFront(string title)
    {
        IntPtr handle = FindWindow(null, title);
        if (handle == IntPtr.Zero)
        {
            return;
        }
        SwitchToThisWindow(handle, true);


        // Call this way:
        SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
    }
于 2012-10-20T06:42:07.550 に答える