![](/img/trans.png)
[英]How to get the path of an active file explorer window in c++ winapi
[英]How to force open file “silently” (minimized, not active) using c++ WinAPI functional?
在我的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上显示的播放器窗口也没有最小化。
第一个问题是:是否可以以“静音”模式(最小化并且不激活)强制打开播放器?
我也尝试使用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函数参数的常量。
因此, 第二个问题是:是否可以在初始化播放器的确切时间“唤醒”线程? 或者,我应该如何确定播放器初始化所需的时间(考虑默认播放器可以是任何东西,并且启动时间实际上不同)?
注意:
第一个问题是:是否可以以“静音”模式(最小化并且不激活)强制打开播放器?
不,您能做的最好的就是请求它,而请求可以忽略。 您已经发现了那部分。
第二个问题:是否可以在播放器初始化的确切时间“唤醒”线程?
不,当进程完全初始化时,没有时间定义。 您已经发现WaitForInputIdle
及其限制。 但是,假设有一个媒体播放器在后台获取CD封面图像(不是那么牵强,不需要为此延迟音频)—何时完成初始化?
另外,请记住, ShellExecute
可能甚至不会启动新进程。 如果存在,则可以使用它来打开文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.