返回

Windows 应用中更改媒体播放器元素时间位置导致的 COM 异常如何解决?

windows

解决 Windows 应用中更改媒体播放器元素时间位置导致的 COM 异常

问题概述

在 Windows 桌面图标下方运行某些应用时,使用不同的方法来更改媒体播放器元素的时间位置可能会抛出 System.Runtime.InteropServices.COMException: "" 异常。

根本原因

该异常是由尝试在应用窗口位于桌面图标下方时更改媒体播放器的时间位置造成的。

解决方案

为了解决此问题,在应用启动时,将其窗口置于桌面图标下方。这将确保应用在尝试更改媒体播放器元素的时间位置之前,已正确放置在桌面图标层中。

步骤:

  1. 在应用启动时,找到桌面窗口。
  2. 遍历桌面窗口的子窗口,并将应用窗口的父窗口设置为桌面窗口。
  3. 现在,应用窗口将位于桌面图标下方。

修改后的代码:

public MainWindow()
{
    this.InitializeComponent();
    MediaPlayerElement.MediaPlayer.MediaEnded += MediaEnded;

    // 在应用启动时将窗口置于桌面图标下方
    IntPtr desktop;
    desktop = Win32Api.FindWindow("Progman", null);
    var result = IntPtr.Zero;
    Win32Api.SendMsgTimeout(desktop, 0x52c, new UIntPtr(0), IntPtr.Zero, 0, 2, result);
    Win32Api.EnumWindows((hwnd, lPara) =>
    {
        if (Win32Api.FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null) != IntPtr.Zero)
        {
            var tmpWnd = Win32Api.FindWindowEx(IntPtr.Zero, hwnd, "WorkerW", null);
            Win32Api.ShowWindow(tmpWnd, 0);
        }
        return true;
    },
        IntPtr.Zero);
    Win32Api.SetParent(WinRT.Interop.WindowNative.GetWindowHandle(App.m_window), desktop);
}

结论

通过在应用启动时将窗口置于桌面图标下方,可以避免在尝试更改媒体播放器元素的时间位置时发生异常。这将确保应用可以正确初始化并访问桌面图标层。

常见问题解答

  1. 为什么我需要以管理员身份运行应用?
    为了获得将窗口置于桌面图标层所需的权限。

  2. 我使用的是 Visual Studio 的较旧版本,怎么办?
    升级到最新版本,以确保可以使用必要的 API。

  3. 还有什么其他解决方法?
    该问题通常发生在 UWP 应用中,在 Win32 应用中可能不会出现。

  4. 为什么我会在特定版本的 Windows 中遇到此问题?
    此问题可能与特定版本的 Windows 中的桌面图标处理方式有关。

  5. 如何检查我的窗口是否位于桌面图标下方?
    使用 Win32Api.GetWindowLong 获取窗口的 GWL_STYLE,并检查 WS_CHILDWS_CAPTION 标志是否已设置。