如何强制打开文件"默默地" (最小化,不活跃)使用c ++ WinAPI功能?

时间:2016-09-05 21:54:42

标签: c++ windows winapi media-player shellexecute

在我的WinAPI C ++应用程序中,我尝试使用 ShellExecuteEx 打开默认系统播放器的音频文件:

int OpenFileWithDefaultProgram(const std::wstring& path, int showMode, HANDLE* hProc) {
    SHELLEXECUTEINFO shInfo;
    ::ZeroMemory(&shInfo, sizeof(SHELLEXECUTEINFO));
    shInfo.cbSize = sizeof(SHELLEXECUTEINFO);
    shInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
    shInfo.hwnd = NULL;
    shInfo.lpVerb = L"open";
    shInfo.lpFile = path.c_str();
    shInfo.nShow = showMode;
    ::ShellExecuteEx(&shInfo);
    *hProc = shInfo.hProcess;
    return (int)shInfo.hInstApp;
}

以这种方式调用 OpenFileWithDefaultProgram 函数:

HANDLE hProc;
int error = OpenFileWithDefaultProgram(path, SW_SHOWMINNOACTIVE, &hProc);
if (error <= 32) {
    // Process error
} else {
    // Some actions
}

然而,某些玩家(例如MediaPlayerClassic HomeCinema - MPC HC)会忽略 SW_SHOWMINNOACTIVE 参数,这会导致打开更改前景窗口的播放器,甚至在某些PC上显示玩家窗口未被最小化。< / p>

第一个问题是:是否有可能强制打开玩家&#34;沉默&#34;模式(最小化并且不变为活动状态)?

我也尝试过使用 GetForegroundWindow SetForegroundWindow ,在 OpenFileWithDefaultProgram之后立即添加 Sleep 之前没有任何帮助(据我所知,玩家需要一些时间来初始化,在此期间前景窗口不会改变):

HWND hWndForeground = GetForegroundWindow();
HANDLE hProc;
int error = OpenFileWithDefaultProgram(path, SW_SHOWMINNOACTIVE, &hProc);
if (error <= 32) {
    // Process error
} else {
    Sleep(100);
    SetForegroundWindow(hWndForeground);
    // Some actions
}

此代码完美地恢复了前景窗口,但我不喜欢我需要用作 Sleep 函数的参数的常量。

因此,第二个问题是:是否可以唤醒&#34;玩家初始化的确切时刻的线程?或者,我应该如何确定玩家初始化所需的时间(考虑到默认玩家可以是任何东西并且开始的时间非常不同)?

注意:

  • 我尝试调用 WaitForSingleObject(hProc,INFINITE),它只是没有完成等待,因为播放器在播放后没有终止;
  • 我尝试调用 WaitForInputIdle(hProc,INFINITE),它立即返回而不等待(可能,因为播放器没有消息队列)。

1 个答案:

答案 0 :(得分:0)

  

第一个问题是:是否有可能强制开放玩家处于“静音”模式(最小化并且不会变为活动状态)?

不,你能做的最好就是请求它,并且可以忽略请求。你已经发现了那个部分。

  

第二个问题:是否有可能在播放器初始化的确切时刻“唤醒”线程?

不,当进程完全初始化时,没有定义任何时刻。您已经发现了WaitForInputIdle及其限制。但想象一下,媒体播放器在后台获取CD封面图像(不是那么牵强,不需要为此延迟音频) - 什么时候完成初始化?

另外,请记住,ShellExecute甚至可能无法启动新流程。如果存在,则可以使用它来打开文件。