Steam一键安装程序_ConvenientSteamInstaller

因为一些小白在安装steam时总是下到蒸汽平台等盗版steam,教程也看不懂,所以我写了一个一键安装steam的小程序

ConvenientSteamInstaller

 下载链接:ConvenientSteamInstaller_Release_WindowsX86.zip - 蓝奏云

ConvenientSteamInstaller适用于懒得去看教程又不会安装steam的小白,它非常无脑,只要点击"一键安装Steam"即可,它会全程自动安装,其他什么也不需要管

e5c5a564f0b640e88a825fb2b1b82790.png

当遇到这种情况时

7ecfac266a2a44f9bbbcdba2d79099b3.png

请勿进行任何操作,未响应属于正常现象

安装完成后会自动弹出steam登录界面

513f7730a97946f0ad00dbf11e6d77f1.png

注意事项

34a81538aada4fb79dfbae3a81cc9d4e.png

默认安装目录是在C盘,可修改,选择完目录后程序会自动补上Steam文件夹作为安装目录

若目录已存在,程序则会清空该目录!

该程序暂时只有下载安装Steam的功能,后续我会将其他功能补全

注:使用前请先开启加速器!!!

请以管理员身份运行!!!

运行前请关闭360等杀毒软件!!!

若出现无法解决的问题请私信我

原理讲解

如果你只是想安装Steam,那么下载完软件到这里就可以结束了,如果你还想了解原理的话请继续往下看,前提是你需要有C++ win32编程基础

我只讲解自动安装原理,其他的如steam安装包下载打开和UI交互等不会讲解,因为这样会让文章又长又臭

首先这是一个正版Steam安装程序窗口

28390f0b31aa47e4a3ff284edd4cfbd2.png

我们第一步就是要程序可以自动点击"下一步"按钮,但我们不知道是用WM_LBUTTONDOWN或WM_LBUTTONUP消息触发还是WM_COMMAND消息触发,这时我们就可以用spy++查看窗口消息

cea67d2300764b17bb4dd8939f682071.png

从中我们可以先获取到窗口的基本信息,类为"#32770", 标题为"Steam 安装",这时就可以用FindWindow函数获取窗口的句柄

#include <Windows.h>
#include <iostream>

int main()
{
    HWND hSteam = FindWindow(L"#32770", L"Steam 安装");


    return 0;
}

通过调试可以看到Steam窗口句柄

cb77849db62e46319f8100f21c4cb2b3.png

再在spy++里监视窗口消息

073bb1b3ef53484ea802cd48425d9165.png

在按下"下一步"按钮时,可以看到窗口发送了一个WM_COMMAND消息,这可能就是我们想要的触发"下一步"按钮的消息(其实这么说并不正确,只是笼统的概括一下)

我们试试向Steam安装程序窗口发送WM_COMMAND消息并附带上这些参数试试

在这之前我们还需要获取到"下一步"按钮的句柄,因为WM_COMMAND的lParam参数是指定控件的句柄

使用FindWindowEx函数获取子窗口的句柄,用spy++获取该按钮的类和标题

fc757c3e422c47f1a484537fc892f528.png

#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;
}

试着运行一下

1dff67b980a9441a936bc7d97d55e41a.gif

可以看到成功了

接下来只要顺着上面的思路就可以一步一步实现自动安装

效果如下,全程未使用键盘鼠标

67e7f4f5754f481b9c21f897aee7e6c6.gif

在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;
}
...

以上代码无法直接运行,因为这只是片段

不过可以从中获得思路

如果有问题请私信联系我

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值