因为一些小白在安装steam时总是下到蒸汽平台等盗版steam,教程也看不懂,所以我写了一个一键安装steam的小程序
ConvenientSteamInstaller
下载链接:ConvenientSteamInstaller_Release_WindowsX86.zip - 蓝奏云
ConvenientSteamInstaller适用于懒得去看教程又不会安装steam的小白,它非常无脑,只要点击"一键安装Steam"即可,它会全程自动安装,其他什么也不需要管
当遇到这种情况时
请勿进行任何操作,未响应属于正常现象
安装完成后会自动弹出steam登录界面
注意事项
默认安装目录是在C盘,可修改,选择完目录后程序会自动补上Steam文件夹作为安装目录
若目录已存在,程序则会清空该目录!
该程序暂时只有下载安装Steam的功能,后续我会将其他功能补全
注:使用前请先开启加速器!!!
请以管理员身份运行!!!
运行前请关闭360等杀毒软件!!!
若出现无法解决的问题请私信我
原理讲解
如果你只是想安装Steam,那么下载完软件到这里就可以结束了,如果你还想了解原理的话请继续往下看,前提是你需要有C++ win32编程基础
我只讲解自动安装原理,其他的如steam安装包下载打开和UI交互等不会讲解,因为这样会让文章又长又臭
首先这是一个正版Steam安装程序窗口
我们第一步就是要程序可以自动点击"下一步"按钮,但我们不知道是用WM_LBUTTONDOWN或WM_LBUTTONUP消息触发还是WM_COMMAND消息触发,这时我们就可以用spy++查看窗口消息
从中我们可以先获取到窗口的基本信息,类为"#32770", 标题为"Steam 安装",这时就可以用FindWindow函数获取窗口的句柄
#include <Windows.h>
#include <iostream>
int main()
{
HWND hSteam = FindWindow(L"#32770", L"Steam 安装");
return 0;
}
通过调试可以看到Steam窗口句柄
再在spy++里监视窗口消息
在按下"下一步"按钮时,可以看到窗口发送了一个WM_COMMAND消息,这可能就是我们想要的触发"下一步"按钮的消息(其实这么说并不正确,只是笼统的概括一下)
我们试试向Steam安装程序窗口发送WM_COMMAND消息并附带上这些参数试试
在这之前我们还需要获取到"下一步"按钮的句柄,因为WM_COMMAND的lParam参数是指定控件的句柄
使用FindWindowEx函数获取子窗口的句柄,用spy++获取该按钮的类和标题
#include <Windows.h>
#include <iostream>
int main()
{
DWORD wParam = (BN_CLICKED << 16) | (1);
HWND hSteam = FindWindow(L"#32770", L"Steam 安装");
HWND hSteamButton = FindWindowEx(hSteam, 0, L"BUTTON", L"下一步(&N) >");
SendMessage(hSteam, WM_COMMAND, wParam, (LPARAM)hSteamButton);
return 0;
}
试着运行一下
可以看到成功了
接下来只要顺着上面的思路就可以一步一步实现自动安装
效果如下,全程未使用键盘鼠标
在CSI里的相关代码如下
...
//自动安装steam
Sleep(500);
HWND hSteam = FindWindow(NULL, L"Steam 安装");
if (!hSteam)
{
error(L"无法找到steam窗口", __LINE__);
return 2;
}
Sleep(100);
DWORD wParam = (BN_CLICKED << 16) | (1);
HWND hSteamButton = FindWindowEx(hSteam, 0, L"BUTTON", L"下一步(&N) >");
if (!hSteamButton)
{
error(L"无法找到steam窗口", __LINE__);
return 3;
}
SendMessage(hSteam, WM_COMMAND, wParam, (LPARAM)hSteamButton);
Sleep(100);
HWND hSteamDialog = FindWindowEx(hSteam, 0, L"#32770", NULL);
if (!hSteamDialog)
{
error(L"无法找到steam窗口", __LINE__);
return 4;
}
hSteamButton = FindWindowEx(hSteamDialog, 0, L"BUTTON", L"简体中文");
if (!hSteamButton)
{
error(L"无法找到steam窗口", __LINE__);
return 5;
}
SendMessage(hSteamButton, BM_CLICK, 0, 0);
Sleep(100);
hSteamButton = FindWindowEx(hSteam, 0, L"BUTTON", L"下一步(&N) >");
if (!hSteamButton)
{
error(L"无法找到steam窗口", __LINE__);
return 6;
}
SendMessage(hSteam, WM_COMMAND, wParam, (LPARAM)hSteamButton);
Sleep(100);
hSteamDialog = FindWindowEx(hSteam, 0, L"#32770", L"");
HWND hSteamEdit = FindWindowEx(hSteamDialog, 0, L"EDIT", NULL);
if (!hSteamEdit)
{
error(L"无法找到steam窗口", __LINE__);
return 7;
}
SendMessage(hSteamEdit, WM_SETTEXT, MAX_PATH, (LPARAM)steam_install_path.c_str());
Sleep(100);
hSteamButton = FindWindowEx(hSteam, 0, L"BUTTON", L"安装(&I)");
SendMessage(hSteam, WM_COMMAND, wParam, (LPARAM)hSteamButton);
for (;;)
{
hSteamButton = FindWindowEx(hSteam, 0, L"BUTTON", L"完成(&F)");
if (!hSteamButton) continue;
SendMessage(hSteam, WM_COMMAND, wParam, (LPARAM)hSteamButton);
break;
}
...
for (;;)
{//BootstrapUpdateUIClass Steam
HWND hSteamUpdate = FindWindow(L"BootstrapUpdateUIClass", L"Steam");
if (!hSteamUpdate) continue;
ShellExecute(NULL, L"open", wstring(steam_install_path + L"\\steam.exe").c_str(), NULL, NULL, SW_SHOWNORMAL);
break;
}
for (;;)
{//Intermediate D3D Window
HWND hSDL = FindWindowA("SDL_app", NULL);
if (!hSDL) continue;
HWND hCBW = FindWindowExA(hSDL, 0, "CefBrowserWindow", NULL);
if (!hCBW) continue;
HWND hCWW = FindWindowExA(hCBW, 0, "Chrome_WidgetWin_0", NULL);
if (!hCWW) continue;
HWND hIDW = FindWindowExA(hCWW, 0, "Intermediate D3D Window", NULL);
if (!hIDW) continue;
break;
}
...
以上代码无法直接运行,因为这只是片段
不过可以从中获得思路
如果有问题请私信联系我