繁体   English   中英

如何使用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上显示的播放器窗口也没有最小化。

第一个问题是:是否可以以“静音”模式(最小化并且不激活)强制打开播放器?

我也尝试使用GetForegroundWindowSetForegroundWindow ,直到我在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函数参数的常量。

因此, 第二个问题是:是否可以在初始化播放器的确切时间“唤醒”线程? 或者,我应该如何确定播放器初始化所需的时间(考虑默认播放器可以是任何东西,并且启动时间实际上不同)?

注意:

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

第一个问题是:是否可以以“静音”模式(最小化并且不激活)强制打开播放器?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM