以最小化状态启动 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 lpStartupInfo
的WORD 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 成员。
位置和大小字段也有类似的注释。
显然,某些应用程序不使用默认值。例如,chrome
和 calc
在之前关闭的位置打开它们的窗口。
您可以在注册表中找到该存储位置并进行更新。
更多信息
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
我试图发明像 minimized
、hidden
、visible
这样的键 - 不走运 :)
您可以将窗口移出屏幕;我取得了部分成功 - chrome
将其移回,因此至少显示了几个像素...
【讨论】:
我无法让它工作,它运行时没有任何反应。你能写一个简短的例子吗? 我尝试了ShellExecute()
和ShellExecuteEx()
函数,它们运行但都忽略了SW_MINIMIZE
状态。我仍然无法让CreateProcess()
工作。
感谢您的帮助,它现在打开窗口但仍然像其他功能一样忽略SW_MINIMIZE
。
可以在浏览器准备好后向外部发送ShowWindow()
吗? STARTUPINFO
或 PROCESS_INFORMATION
结构是否提供了足够的信息来执行此操作?
我想让它最小化的原因不是关于可见性,而是关于焦点。无论窗口是否在屏幕外,一旦窗口初始化,它仍然会窃取焦点。我认为最好的方法是在计时器循环中发送ShowWindow()
,这样一旦成功,它就会将焦点返回到以前的活动窗口,这就是我打算做的。再次感谢您的时间和精力先生:)以上是关于以最小化状态启动 chromium 浏览器 (Win32/WinAPI)的主要内容,如果未能解决你的问题,请参考以下文章
使用 Raspbian JESSIE 启动 Pi3 时自动启动“Chromium”
WSL下使用VcXsrv启动chromium browser及常见错误解析 (ubuntu18.04, 图形界面)