SetWindowPos无法设置窗口"始终在顶部"

时间:2014-03-21 00:58:07

标签: c# .net windows visual-studio-2013

我正在尝试制作一个小程序,这样我就可以保持我的vlc播放器始终处于最佳状态,以便我可以在我的某些屏幕上观看电影,同时做其他事情。

我在另一个人身上发现了this code。我的代码看起来像这样

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System;
using System.Diagnostics;
using System.Windows.Shapes;
using System.Runtime.InteropServices;

namespace WpfApplication1
{
    public class ProcessManager
    {
        [DllImport("user32.dll")]
        private static extern bool ShowWindow(IntPtr hWnd, uint windowStyle);

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

        public ProcessManager()
        {
            string processName = "vlc";
            //SearchProcessAndModifyState(processName);
        }

        public void SearchProcessAndModifyState(string targetProcessName)
        {
            Process specifiedProcess = null;
            Process[] processes = Process.GetProcesses();
            for (int i = 0; i < processes.Length; i++)
            {
                Process process = processes[i];
                if (process.ProcessName == targetProcessName)
                {
                    specifiedProcess = process;
                    break;
                }
            }
            if (specifiedProcess != null)
            {
                ProcessManager.ShowWindow(specifiedProcess.MainWindowHandle, 1u);
                ProcessManager.SetWindowPos(specifiedProcess.MainWindowHandle, new IntPtr(-1), 0, 0, 0, 0, 3u);
            }
        }
    }
}

现在,当我运行此程序时,vlc窗口将显示,但它不会保持在最顶层。所以我猜ShowWindow工作,但SetWindowPos没有。我通过File创建了项目 - &gt;新 - &gt;项目...... - &gt; Visual C# - &gt; Windows - &gt; Visual Studio 2013中的WPF应用程序,我使用的是Windows 8.1。有人知道吗?

1 个答案:

答案 0 :(得分:1)

我有完全相同的问题。我通过在调用SetWindowPos之前插入以下内容来解决它:

const int GWL_EXSTYLE = -20;
const int WS_EX_TOPMOST = 8;

var extStyle = GetWindowLongPtr(hWnd, GWL_EXSTYLE).ToInt64();
extStyle |= WS_EX_TOPMOST;
SetWindowLongPtr(hWnd, GWL_EXSTYLE, new IntPtr(extStyle));

(GetWindowLongPtr和SetWindowLongPtr都可以在pinvoke.net上查找 - 从我的手机内存发布或者会给出一个更全面的答案!)