在最小化状态下启动chromium浏览器(Win32/WinAPI)



我想在最小化状态下启动浏览器,但在这个列表中没有最小化选项。所以我想使用ShowWindow(),但出现了一些问题。我不知道如何使用EnumWindows()或其衍生物。我知道的唯一替代方案是GetWindow(),但我不确定窗口在Z阶的位置。这是我的解决方案:

HWND hwnd,hwnd2; //hwnd is my application's top level window
char t[128];
std::string t2;
for(int i=0; i<128&&t2!="found"; i++)
{
if(!i||i==64) hwnd2=hwnd; //turn direction
hwnd2=GetWindow(hwnd2,i<64?2:3); //loop backwards and forwards
GetWindowText(hwnd2,t,GetWindowTextLength(hwnd2)+1);
t2=t; if(t2.find("New")!=-1) t2="Found"; //Default title is "New Tab..."
}
ShowWindow(hwnd2,SW_MINIMIZE);

假设不会有超过128个窗口,它可以正常工作,但由于一个窗口需要大约2秒才能打开,所以在ShowWindow((发生时,该窗口还没有准备好。所以我用了一个计时器。

SetTimer(hwnd,1,2000,0);

case WM_TIMER:
KillTimer(hwnd,1);
ShowWindow(hwnd2,SW_MINIMIZE);
break;

但不可能知道确切的时间,所以窗口在显示几毫秒后就会最小化。我试着以50ms的间隔设置多个定时器。

for(int i=0; i<50; i++) SetTimer(hwnd,1+i,i*50,0);

case WM_TIMER:
KillTimer(hwnd,wParam);
ShowWindow(hwnd2,SW_MINIMIZE);
break;

它通常会在窗口显示之前最小化窗口,但并不总是如此。它还每隔50ms将光标更改为忙碌状态。当最小化成功执行一次时,有没有办法阻止这种情况?无法从ShowWindow()的返回值中确定这一点,所以有办法吗?如何保证在窗口显示之前最小化窗口?我可以以某种方式让它等到浏览器窗口准备好,然后在正确的时间立即发送ShowWindow()吗?如何将我的解决方案改进为更简单的解决方案?

WinExec对派生的进程几乎没有控制权。

使用CreateProcess,并将LPSTARTUPINFOA lpStartupInfoWORD wShowWindow;设置为SW_MINIMIZE

确保dwFlags包含STARTF_USESHOWWINDOW

以下是使用方法:

#include <windows.h>
int main()
{
PROCESS_INFORMATION processInformation = { 0 };
STARTUPINFO startupInfo = { sizeof STARTUPINFO };
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = SW_MINIMIZE;
wchar_t cmd[] = L"C:\Program Files\Internet Explorer\iexplore.exe";
// Create the process
BOOL result = CreateProcess(NULL,
cmd,     // command line 
NULL,          // process security attributes 
NULL,          // primary thread security attributes 
FALSE,         // handles are not inherited 
NORMAL_PRIORITY_CLASS |
CREATE_NO_WINDOW, // creation flags 
NULL,          // use parent's environment 
NULL,          // use parent's current directory 
&startupInfo,  // STARTUPINFO pointer 
&processInformation);  // receives PROCESS_INFORMATION 
}

更新

在引用的文档中,它们表示:

如果ShowWindow的nCmdShow参数设置为SW_SHOWDEFAULT,则使用wShowWindow成员。

在位置和大小字段上也有类似的注释。

显然,有些应用程序不使用默认值。例如,chromecalc在之前关闭的位置打开它们的窗口。

您可以在注册表中找到存储的位置并进行更新。

更多信息

Google Chrome默认打开位置和大小建议编辑Preferences文件。它看起来像这样:

"window_placement":{"bottom":1363,"left":406,"maximized":false,"right":1356,"top":217,"visible":false,"work_area_bottom":1400,"work_area_left":0,"work_area_right":2560,"work_area_top":0}

我试着发明了像minimizedhiddenvisible这样的密钥——运气不好:(

你可以把窗口从屏幕上移开;我取得了部分成功——chrome将其移回,所以至少有几个像素显示。。。

相关内容

  • 没有找到相关文章

最新更新