自制gdc-client.exe窗体辅助运行程序
0.CSDN站内下载链接
[csdn站内下载链接]gdc-client.exe窗体辅助运行程序gdc-client Assistant
https://download.csdn.net/download/Re_98560286270/89078180
[度娘链接_推荐]gdc-client.exe窗体辅助运行程序 提取码csv4
https://pan.baidu.com/s/1WnI4ZPPoP08gwzWbPTk7Dg?pwd=csv4
1.使用方法
很多医学生在第一次接触命令行式的gdc-client.exe时都会被这种老式程序的运行方式搞得头疼,为什么每次用这个程序下载东西还要背一大堆的指令,而且还一个字也不能错(汗)。那有没有更简单的操作方式让我们不用一次次地输入复杂的命令还能方便地下载到文件呢(
楼主专门为解决这个问题写了一个窗体程序,使用方式如下:(代码在文章最后面)
1.1界面
操作也很简单,从上到下把按钮按一遍即可(
1.2按下按钮后选择文件
按下gdc路径查找后,找到你的gdc-client.exe文件,然后双击
双击后程序会记下你的gdc-client.exe文件路径
txt路径查找同理
找到txt文件后同样会记录下来
1.3点击下载
上面两步完成并且文件路径成功在程序里显示出来后,直接点击下载按钮,程序会通过控制台自动调用gdc-client.exe的下载指令下载你指定的txt中的内容
2.代码
本程序使用语言的是c++,项目种类为windows窗体程序。
(有人可能会问,我把下面的代码复制到devc++了,为什么编译不了,一直报错啊,那是因为你没复制到windows窗体程序项目里,devc++默认是控制台项目,直接复制会导致一些头文件里的变量莫名其妙的找不到)(关于如何在devc++例创建windows窗体程序空项目见下)
最后是代码部分,创建好windows窗体程序空项目后,删掉自带代码,把下面的代码复制进去,编辑,即可得到上面展示的同款窗体程序
#include <windows.h>
#include<tchar.h>
#include<commctrl.h>
static TCHAR szTitle[] = _T("gdc-client.exe辅助运行窗体程序(by Re_98560286270)(· - ·)");
UINT IDC_BUTTON_Download = 200; // 按钮ID 下载按钮
UINT IDC_BUTTON_FindGDC = 201; // 按钮ID gdc路径查找
UINT IDC_BUTTON_FindTXT = 202; // 按钮ID txt路径查找
UINT EDIT_FindGDC = 203; // 编辑框ID gdc路径查找
HWND hwndInput_FindGDC;
UINT EDIT_FindTXT = 204; // 编辑框ID txt路径查找
HWND hwndInput_FindTXT;
UINT EDIT_GetCommand = 205; // 编辑框ID 显示最终命令
HWND hwndInput_GetCommand;
void OpenFileSelectionDialog(HWND hwnd, UINT source,UINT targer); // 打开文件选择框函数,返回值:文件路径
TCHAR selectedFilePath[MAX_PATH]; //用于上方函数保存文件路径
/* This is where all the input to the window goes to 这是窗口的所有输入所在的位置 */
// [第五步]窗口函数中处理窗口消息
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
//-----绘制字体-----
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting[] = _T("请按指示填写下面的内容:");
TCHAR findGDC[] = _T("1.输入gdc-client.exe的文件路径");
TCHAR findTXT[] = _T("2.输入gdc-manifest.txt的文件路径");
TCHAR startDownload[] = _T("3.确认指令无误后点击下载(注:文件会下载到本程序位置而不是gdc所在位置)");
//-----绘制字体-----
switch(Message) {
case WM_CREATE:
{
//-----创建按钮-----
HWND hButtonWnd_FindGDC = CreateWindow(WC_BUTTON,_T("gdc路径查找"),WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE, 10,50,100,35,hwnd, (HMENU)IDC_BUTTON_FindGDC,NULL,NULL);
HWND hButtonWnd_FindTXT = CreateWindow(WC_BUTTON,_T("txt路径查找"),WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE, 10,110,100,35,hwnd, (HMENU)IDC_BUTTON_FindTXT,NULL,NULL);
HWND hButtonWnd_Download = CreateWindow(WC_BUTTON,_T("下载按钮"),WS_CHILD|BS_PUSHBUTTON|WS_VISIBLE, 10,170,100,35,hwnd, (HMENU)IDC_BUTTON_Download,NULL,NULL);
//-----创建按钮-----
//-----创建输入框-----
hwndInput_FindGDC = CreateWindow( TEXT("edit"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_LEFT,
120,57,400,20,
hwnd, (HMENU)EDIT_FindGDC, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
hwndInput_FindTXT = CreateWindow( TEXT("edit"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_LEFT,
120,117,400,20,
hwnd, (HMENU)EDIT_FindTXT, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
hwndInput_GetCommand = CreateWindow( TEXT("edit"), NULL,
WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL | ES_LEFT,
120,177,400,20,
hwnd, (HMENU)EDIT_GetCommand, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
//-----创建输入框-----
}
break;
//-----响应按钮-----
case WM_COMMAND:
{
UINT nCtrlID = LOWORD(wParam); // wParam 低字节表示ID号,高字节表示控件通知
UINT nCode = HIWORD(wParam);
if (nCode == BN_CLICKED && nCtrlID == IDC_BUTTON_FindGDC) // 按钮按下 且 按钮ID为 IDC_BUTTON_FindGDC
{
OpenFileSelectionDialog(hwnd, IDC_BUTTON_FindGDC, EDIT_FindGDC);
}
if (nCode == BN_CLICKED && nCtrlID == IDC_BUTTON_FindTXT) // 按钮按下 且 按钮ID为 IDC_BUTTON_FindTXT
{
OpenFileSelectionDialog(hwnd, IDC_BUTTON_FindTXT, EDIT_FindTXT);
}
if (nCode == BN_CLICKED && nCtrlID == IDC_BUTTON_Download) // 按钮按下 且 按钮ID为 IDC_BUTTON_Download
{
// 获取文本框内容
TCHAR gdcPath[MAX_PATH];
GetWindowText(hwndInput_FindGDC, gdcPath, MAX_PATH);
TCHAR txtPath[MAX_PATH];
GetWindowText(hwndInput_FindTXT, txtPath, MAX_PATH);
//字符串合并 _tcscat() 组成完整命令
TCHAR command[MAX_PATH] = _T("\0");
_tcscat(command, gdcPath);
_tcscat(command, _T(" download -m "));
_tcscat(command, txtPath);
//双反斜杠处理 手动遍历 _tcslen求长度
TCHAR finalCommand[MAX_PATH] = _T("\0");
INT commandPosition = 0;
//for(INT i = 0; i < _tcslen(command); i++)
// i指向command finalI指向finalCommand 一旦出现反斜杠,finalI就会比i大1 出现次数越多差距越大
for(INT i = 0, finalI = 0; i < MAX_PATH; )
{
if(command[i] != '\\')
{
finalCommand[finalI] = command[i];
}
else if(command[i] == '\\')
{
finalCommand[finalI] = command[i];
finalCommand[finalI+1] = '\\';
finalI++;
}
i++;
finalI++;
}
//调试
SetWindowText(GetDlgItem(hwnd, EDIT_GetCommand), finalCommand);
// 调用系统控制台
system(finalCommand);
//为什么要初始化为"\0": strcat的实现模式是将src中的所有字符(连同字符串最后的’\0’一起)加到dest字符串中第一个‘\0’的位置,
//具体一点说就是将dest中第一个’\0’替换成src的第一个字符,然后该’\0’后的字符替换成src的第二个字符,后面以此类推。
/*
1.追加的字符串src和目标字符串dest中都必须要带有字符’\0’,并且追加字符串src必须以‘\0’结尾,否则追加过程无法顺利实现。
2.目标字符串空间必须足够大(足够容纳下追加字符串src的内容)。
3.目标空间必须可修改(前面不能加const并且不能说常量字符串)
*/
}
}
break;
//-----响应按钮-----
//-----绘制字体-----
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
TextOut(hdc,10,5,greeting,_tcslen(greeting));
TextOut(hdc,10,30,findGDC,_tcslen(findGDC));
TextOut(hdc,10,90,findTXT,_tcslen(findTXT));
TextOut(hdc,10,150,startDownload,_tcslen(startDownload));
EndPaint(hwnd,&ps);
break;
//-----绘制字体-----
/* Upon destruction, tell the main thread to stop 销毁后,通知主线程停止 */
case WM_DESTROY: {
PostQuitMessage(0);
break;
}
/* All other messages (a lot of them) are processed using default procedures 所有其他消息(很多)都使用默认过程进行处理 */
default:
return DefWindowProc(hwnd, Message, wParam, lParam); // 用默认方法处理消息
}
return 0;
}
//参数:主窗体,目的文本编辑器句柄 功能:将文件选择框的内容传入指定文本编辑器
void OpenFileSelectionDialog(HWND hwnd, UINT source,UINT targer) {
OPENFILENAME ofn;
TCHAR szFile[MAX_PATH] = {0};
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
//ofn.lpstrFilter = TEXT("All Files\0*.*\0");
if(source == 201) // gdc
{
ofn.lpstrFilter = TEXT("EXE Files (*.exe)\0*.*exe\0");
}
else if(source == 202) // txt
{
ofn.lpstrFilter = TEXT("TXT files (*.txt)\0*.*txt\0");
}
else
{
ofn.lpstrFilter = TEXT("All Files\0*.*\0");
}
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn) == TRUE) {
// 将选择的文件路径保存到全局变量中
lstrcpy(selectedFilePath, ofn.lpstrFile);
// 将文件路径显示在文本编辑框中
SetWindowText(GetDlgItem(hwnd, targer), selectedFilePath);
}
}
/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// [第一步]注册窗口类
WNDCLASSEX wc; /* A properties struct of our window 我们窗口的属性结构 */
HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window 一个“HANDLE”,因此是H,或指向我们窗口的指针 */
//MSG msg; /* A temporary location for all messages */ 原默认程序
/* zero out the struct and set the stuff we want to modify 清空结构并设置要修改的内容 */
memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc; /* This is where we will send messages to 这是我们发送消息的地方 */
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it 白色,COLOR_WINDOW只是系统颜色的#定义,请尝试Ctrl+单击它 */
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "WindowClass";
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
// [第二步]创建窗口
//hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW, 原默认程序
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass",szTitle,WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, /* x */
CW_USEDEFAULT, /* y */
600, /* width 640 */
350, /* height 480 */
NULL,NULL,hInstance,NULL);
// 创建窗口失败
if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
/*
This is the heart of our program where all input is processed and //这是我们程序的核心,所有输入都经过处理
sent to WndProc. Note that GetMessage blocks code flow until it receives something, so //发送到WndProc。请注意,GetMessage会阻止代码流,直到它收到一些东西,所以
this loop will not produce unreasonably high CPU usage //这个循环不会产生不合理的高CPU使用率
*/
// [第四步] 开始消息循环
MSG msg; /* A temporary location for all messages 所有消息的临时位置 */
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
TranslateMessage(&msg); /* Translate key codes to chars if present 将按键消息转换为字符消息 */
DispatchMessage(&msg); /* Send it to WndProc 将消息分发给窗口程序 */
}
return msg.wParam;
}
CSDN站内直接下载链接已更新(