在我的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;玩家初始化的确切时刻的线程?或者,我应该如何确定玩家初始化所需的时间(考虑到默认玩家可以是任何东西并且开始的时间非常不同)?
注意:
答案 0 :(得分:0)
第一个问题是:是否有可能强制开放玩家处于“静音”模式(最小化并且不会变为活动状态)?
不,你能做的最好就是请求它,并且可以忽略请求。你已经发现了那个部分。
第二个问题:是否有可能在播放器初始化的确切时刻“唤醒”线程?
不,当进程完全初始化时,没有定义任何时刻。您已经发现了WaitForInputIdle
及其限制。但想象一下,媒体播放器在后台获取CD封面图像(不是那么牵强,不需要为此延迟音频) - 什么时候完成初始化?
另外,请记住,ShellExecute
甚至可能无法启动新流程。如果存在,则可以使用它来打开文件。