Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
强制不同的应用程序位于顶部C#_C#_Wpf_Pinvoke - Fatal编程技术网

强制不同的应用程序位于顶部C#

强制不同的应用程序位于顶部C#,c#,wpf,pinvoke,C#,Wpf,Pinvoke,我们有一个.NET4.6.1c#WPF应用程序,它占据了整个屏幕。我们希望能够在主应用程序顶部打开/关闭另一个较小的应用程序窗口(以便他们可以与我们的支持人员聊天)。有几种第三方工具可以做到这一点,因此我知道这是可能的: 我们已经尝试了很多东西,我可以让它出现在最前面,但是只要我们触摸我们的应用程序(它占据了整个屏幕),我们想要保持在最上面的那个就会出现在后面。。。看到一些解决方案,将迫使其他应用程序保持领先地位,但它会冻结主应用程序。。。但这并不理想,因为我们仍然希望能够使用我们的应用程序,

我们有一个.NET4.6.1c#WPF应用程序,它占据了整个屏幕。我们希望能够在主应用程序顶部打开/关闭另一个较小的应用程序窗口(以便他们可以与我们的支持人员聊天)。有几种第三方工具可以做到这一点,因此我知道这是可能的:

我们已经尝试了很多东西,我可以让它出现在最前面,但是只要我们触摸我们的应用程序(它占据了整个屏幕),我们想要保持在最上面的那个就会出现在后面。。。看到一些解决方案,将迫使其他应用程序保持领先地位,但它会冻结主应用程序。。。但这并不理想,因为我们仍然希望能够使用我们的应用程序,而另一个应用程序在我们的应用程序之上打开

有什么想法吗?谢谢

    public static void SearchForRunningProcessByWindow(string windowCaption, ShowWindowState windowState = ShowWindowState.SW_SHOWNORMAL)
    {
        IntPtr hWnd = FindWindowByCaption(0, windowCaption);
        if (hWnd != IntPtr.Zero)
        {
            ShowWindow(hWnd, (int)ShowWindowState.SW_SHOWNORMAL);
            SetForegroundWindow(hWnd);

            // this is supposed to make it stay on top... ?
            SetWindowPos(hWnd, new IntPtr(-1), 0, 0, 0, 0, 0x4000 | 0x0002 | 0x0001);
            return true;
        }
    }
    [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
    static extern IntPtr FindWindowByCaption(int ZeroOnly, string lpWindowName);
    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, uint nCmdShow);

    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")]
    private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, uint uFlags);
编辑:尝试了暴力方式,但使我们的主应用程序无法使用:

private static Timer _timer;
static void ForceOnTop(string windowCaption)
{
    var timeout = 250;
    _timer = new Timer(TimerCallback, new Tuple<long, string>(timeout, windowCaption), timeout, Timeout.Infinite);
}

private static void TimerCallback(object state)
{
    var @tuple = (Tuple<long, string>) state;
    SearchForRunningProcessByWindow(@tuple.Item2);
    _timer.Change(@tuple.Item1, Timeout.Infinite);
}
private static Timer\u Timer;
静态void ForceOnTop(字符串窗口标题)
{
var超时=250;
_计时器=新计时器(TimerCallback,新元组(timeout,windowCaption),timeout,timeout.Infinite);
}
私有静态void TimerCallback(对象状态)
{
var@tuple=(tuple)状态;
SearchForRunningProcessByWindow(@tuple.Item2);
_timer.Change(@tuple.Item1,Timeout.Infinite);
}

您的小应用程序是从主应用程序启动的吗?或者单独启动?它是从我们的主应用程序启动的,但我们的主应用程序偶尔会重新启动。。。这就是为什么我通过窗口标题查找另一个应用程序你尝试了什么解决方案冻结了主应用程序?听起来解决方案应该包括多线程。放入一个checbox和处理程序,当选中时,将窗口设置为最顶层。要恢复正常,请取消选中该复选框。呜呜,我误读了这个问题是的,你需要转到com层。读一下这个,也许你应该重新考虑对重复闭包的争议。你知道窗口所有权是什么意思吗?你的小应用程序是从你的主应用程序开始的吗?或者单独启动?它是从我们的主应用程序启动的,但我们的主应用程序偶尔会重新启动。。。这就是为什么我通过窗口标题查找另一个应用程序你尝试了什么解决方案冻结了主应用程序?听起来解决方案应该包括多线程。放入一个checbox和处理程序,当选中时,将窗口设置为最顶层。要恢复正常,请取消选中该复选框。呜呜,我误读了这个问题是的,你需要转到com层。读一下这个,也许你应该重新考虑对重复闭包的争议。你知道窗口所有权是什么意思吗?