|
|
应用:文本框输入字符串,点击按钮
本帖最后由 cutebe 于 2026-4-26 21:49 编辑
打开运行对话框,文本框输入命令后,点击确定以打开命令提示符
- function 打开运行命令提示符测试(){
- const 执行宏调用=ExecuteExcel4Macro;console.clear();
- let 运行标题="运行",命令标题="打开命令提示符 - 运行";
- var 运行句柄=执行宏调用(`CALL("User32","FindWindowA","JJF",0,"${运行标题}")`);
- var 命令句柄=执行宏调用(`CALL("User32","FindWindowA","JJF",0,"${命令标题}")`);
-
- if(!(运行句柄|命令句柄)){
- console.log("打开运行对话框");let 参数运行="shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}";
- let 结果=执行宏调用(`CALL("Shell32","ShellExecuteA","JJFFFJJ",0,"open","explorer","${参数运行}",0,1)`);
- }else{
- if(运行句柄){
- var 标题=命令标题,命令="CMD",句柄=运行句柄;
- }else{if(命令句柄){var 标题=运行标题,命令="control",句柄=命令句柄;}}
-
- let 可显示=执行宏调用(`CALL("User32","IsWindowVisible","JJ",${句柄})`);
- 执行宏调用(`CALL("User32", "SetWindowTextA", "JJF", ${句柄},"${标题}")`);
- console.log("句柄:"+句柄+"\t窗口名:"+获取窗口标题(句柄)+"\t类名:"+获取类名(句柄));
- if(获取类名(句柄)=="#32770" && 可显示){
- var 复合框句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJFJ",${句柄},0,"ComboBox",0)`); //复合框
- console.log("复合框句柄:"+复合框句柄+"\t窗口名:"+获取窗口标题(复合框句柄)+"\t类名:"+获取类名(复合框句柄));
- var 编辑框句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJFJ",${复合框句柄},0,"Edit",0)`); //编辑框
- console.log("编辑框句柄:"+编辑框句柄+"\t窗口名:"+获取窗口标题(编辑框句柄)+"\t类名:"+获取类名(编辑框句柄));
- let 设置文本=0xC;
- var 设置文本框内容=执行宏调用(`CALL("User32", "SendMessageA", "JJJJF", ${编辑框句柄},${设置文本},0,"${命令}")`);
-
- alert("按 空格 关闭此对话框以 运行 命令提示符");
- var 确定按钮句柄=执行宏调用(`CALL("User32","FindWindowExA","JJJFF",${句柄},0,"Button","确定")`); //确定按钮
- console.log("确定按钮句柄:"+确定按钮句柄+"\t窗口名:"+获取窗口标题(确定按钮句柄)+"\t类名:"+获取类名(确定按钮句柄));
- let 点击=0xF5; //消息点击BM_CLICK=0xF5
- let 点击确定=执行宏调用(`CALL("User32", "SendMessageA", "JJJJJ", ${确定按钮句柄},${点击},0,0)`);
- }
- }
- }
- function 获取窗口标题(窗口句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- let 窗口标题长度=执行宏调用(`CALL("User32", "GetWindowTextLengthA", "JJ", ${窗口句柄})`);
- let 缓冲区大小=窗口标题长度+1,窗口标题="";
- const 内存地址 = 执行宏调用(`CALL("Kernel32", "VirtualAlloc", "JJJJJ", 0, ${缓冲区大小}, ${0x3000}, 4)`); //申请内存
- let 标题长度=执行宏调用(`CALL("User32", "GetWindowTextA", "JJJJ", ${窗口句柄},${内存地址},${窗口标题长度+1})`);
- if(标题长度){窗口标题=内存读取字符串(内存地址);}
- 执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`); //释放内存
- return 窗口标题;
- }
- function 获取类名(窗口句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- let 缓冲区大小=256,类名=""; //类名最长255
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${缓冲区大小},${0x3000},4)`); //申请内存
- let 类名长度=执行宏调用(`CALL("User32","GetClassNameA","JJJJ",${窗口句柄},${内存地址},${缓冲区大小})`);
- if(类名长度){类名=内存读取字符串(内存地址);}
- 执行宏调用(`CALL("Kernel32","VirtualFree","JJJJ",${内存地址},0,${0x8000})`); //释放内存
- return 类名;
- }
- function 内存读取字符串(内存地址){ //返回字符串
- const 执行宏调用=ExecuteExcel4Macro,段长度=127;
- const 总字节=执行宏调用(`CALL("Kernel32","lstrlenA","JJ",${内存地址})`); //内存文本字节数
- let 偏移字节=0,文本字符串=分段文本='';
- while(偏移字节<总字节){ //返回字符串F。 //返回超255字节时,也需要分段操作
- 分段文本=执行宏调用(`CALL("Kernel32","lstrcpynW","FFJJ","",${内存地址+偏移字节},${段长度})`);
- 偏移字节+=分段文本.replace(/[^\x00-\xff]/g,'xx').length; //计算字符串字节数
- 文本字符串+=分段文本;
- }
- return 文本字符串;
- }
复制代码
|
|