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

Posted

技术标签:

【中文标题】以最小化状态启动 chromium 浏览器 (Win32/WinAPI)【英文标题】:Start chromium browser in minimized state (Win32/WinAPI) 【发布时间】:2020-12-17 19:26:17 【问题描述】:

我想以最小化状态启动浏览器,但是in this list 没有最小化选项。所以我想到了使用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;

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

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;

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

【问题讨论】:

你能分享一下为什么要最小化启动浏览器吗? @huysentruitw 我写了一个应用程序,可以让我自动登录到一些网站。当它运行时,我不希望它转移注意力,因为我会在电脑上做其他事情。 你如何启动那个浏览器? @VladFeinstein 我只是使用WinExec("chrome.exe somewebsite.com",SW_HIDE); 这会在不显示控制台窗口的情况下运行它。 【参考方案1】:

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 default opening position and size 建议编辑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 将其移回,因此至少显示了几个像素...

【讨论】:

我无法让它工作,它运行时没有任何反应。你能写一个简短的例子吗? 我尝试了ShellExecute()ShellExecuteEx() 函数,它们运行但都忽略了SW_MINIMIZE 状态。我仍然无法让CreateProcess() 工作。 感谢您的帮助,它现在打开窗口但仍然像其他功能一样忽略SW_MINIMIZE 可以在浏览器准备好后向外部发送ShowWindow() 吗? STARTUPINFOPROCESS_INFORMATION 结构是否提供了足够的信息来执行此操作? 我想让它最小化的原因不是关于可见性,而是关于焦点。无论窗口是否在屏幕外,一旦窗口初始化,它仍然会窃取焦点。我认为最好的方法是在计时器循环中发送ShowWindow(),这样一旦成功,它就会将焦点返回到以前的活动窗口,这就是我打算做的。再次感谢您的时间和精力先生:)

以上是关于以最小化状态启动 chromium 浏览器 (Win32/WinAPI)的主要内容,如果未能解决你的问题,请参考以下文章

如何调试最新chromium

使用 Raspbian JESSIE 启动 Pi3 时自动启动“Chromium”

WSL下使用VcXsrv启动chromium browser及常见错误解析 (ubuntu18.04, 图形界面)

如何启动 Outlook 处于最小化状态

禁用 Microsoft Edge (Chromium) 开发人员模式扩展在启动时弹出

带有浏览器库的 RobotFrameWork 以隐身模式启动,但需要正常模式