golang调用大漠插件

1.调用大漠插件

给有需要的看一下,最好去学习一下大漠。

2. 学习网址

https://lb1989.com/?cat=105

3.具体实现

package main

import (
	"context"
	"fmt"
	"go_codetwo/xiaotool/v22/util"
	"log"
	"net/http"
	"os"
	"os/signal"
	"strconv"
	"strings"
	"syscall"
	"time"

	"github.com/gin-gonic/gin"

	"github.com/redzl/go-dmsoft"
)
const (
	// 填写自己的注册码
	DmRegCode   = ""
	DmExtraCode = ""
)

// go env -w GOARCH=386
//go env -w GOARCH=amd64

var dm *dmsoft.Dmsoft
var dir, _ = os.Getwd()

// 句柄集
var handleColl []int

type _bytes struct {
	Data int
	Len  int
}

// rsrc -manifest main.manifest -o main.syso
// go build -ldflags="-H windowsgui -w -s"
// 绑定 JSON

func work(gpt string, prormt string) {

	time.Sleep(1 * time.Second)
	fmt.Println("第一步")
	proceess_one(gpt)
	time.Sleep(1 * time.Second)
	fmt.Println("第二步")
	proceess_two(prormt)
	time.Sleep(1 * time.Second)
	fmt.Println("第三步")
	proceess_there(prormt)

}

type Login struct {
	Gpt    string `form:"gpt" json:"gpt" xml:"gpt"  binding:"required"`
	Prormt string `form:"prormt" json:"prormt" xml:"prormt" binding:"required"`
}

func main() {
	dmtainanl()
	defer Release()
	//work("25525", "2565")
	aa()
}

func aa() {
	router := gin.Default()
	// 绑定 JSON ({"user": "manu", "password": "123"})
	router.POST("/loginJSON", func(c *gin.Context) {
		var json Login
		if err := c.ShouldBindJSON(&json); err != nil {
			c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
			return
		}
		Gptstr, err := util.DecodeBase64(json.Gpt)
		if err != nil {
			fmt.Println("编码失败")
		}
		work(string(Gptstr), json.Prormt)
		c.JSON(http.StatusOK, gin.H{"status": "you are logged in"})
	})

	

	//创建HTTP服务器
	server := &http.Server{
		Addr:    ":8088",
		Handler: router,
	}

	//启动HTTP服务器
	go func() {
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen: %s\n", err)
		}
	}()

	//等待一个INT或TERM信号
	quit := make(chan os.Signal)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit
	log.Println("Shutdown Server ...")

	//创建超时上下文,Shutdown可以让未处理的连接在这个时间内关闭
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	//停止HTTP服务器
	if err := server.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err)
	}
}


func dmtainanl() {
	dm = CreateDmObj()
	log.Printf("插件版本:%s", dm.Ver())
	ret := dm.Reg(DmRegCode, DmExtraCode)
	switch ret {
	case 1:
		log.Println("付费功能注册成功")
	case -1:
		log.Println("无法连接网络")
	case -2:
		log.Println("进程没有以管理员方式运行")
	default:
		log.Println("失败 (未知错误)")
	}
	///defer
	EnumWindowHwnd()
	BindMultipleWindows(dm, handleColl[0])

}

// Chrome Legacy Window  Chrome Legacy Window
// Chrome_RenderWidgetHostHWND  Chrome_RenderWidgetHostHWND
func EnumWindowHwnd() {
	//handleStr := dm.EnumWindow(0, "网址导航 和另外 5 个页面 - 个人 - Microsoft? Edge", "Chrome_WidgetWin_1", 1+2)
	handleStr := dm.EnumWindowByProcess("msedge.exe", "", "", 1+8+16)
	fmt.Println(handleStr)
	handleStrSlice := strings.Split(handleStr, ",")
	// 将string类型转换为int类型
	for _, str := range handleStrSlice {
		num, err := strconv.Atoi(str)
		if err != nil {
			fmt.Println(err)
		}
		handleColl = append(handleColl, num)
	}
	log.Printf("获取到 %d 个窗口句柄:%v", len(handleColl), handleColl)
}

func Release() {
	log.Printf("释放大漠对象:%v,窗口句柄:%d", dm, handleColl[0])
	dm.UnBindWindow() // 解除绑定
	dm.Release()

}

func BindMultipleWindows(dm *dmsoft.Dmsoft, handle int) {
	// 绑定窗口

	ret := dm.BindWindowEx(handle, "normal", "windows3", "windows", "", 0)
	//dm.EnumWindowByProcess
	if ret != 0 {
		log.Printf("绑定窗口成功,句柄:%d", handle)
	}
	//设置字体  设置图片路径
	ret = dm.SetPath(dir)
	if ret != 0 {
		log.Printf("全局路径:%d", handle)
	}
	//设置字体  设置图片路径
	ret = dm.SetDict(0, dir+"\\ziti.txt")
	if ret != 0 {
		log.Printf("字库成功:%d", handle)
	}

	ret = dm.SetWindowState(handle, 15)
	if ret != 0 {
		log.Printf("激活窗口,句柄:%d", handle)
	}
	// 截图
	_ = dm.Capture(0, 0, 2000, 2000, "test_"+strconv.Itoa(handle)+".bmp")
}

func CreateDmObj() *dmsoft.Dmsoft {
	// 设置dm.dll路径,并进行注册
	ret := dmsoft.SetDllPathW(dir+"\\dm.dll", 0)
	if ret {
		log.Println("插件注册成功!")
	} else {
		log.Println("插件注册失败!")
	}
	return dmsoft.NewDmsoft()
}

func FindPic_dm(a, b, c, d int, picstr string, colorstr string, index int) (int, int) {
	var x, y int
	_ = dm.FindPic(a, b, c, d, picstr, colorstr, 0.89, index, &x, &y)
	// fmt.Println(picstr)
	// fmt.Println(colorstr)
	if x >= 0 && y >= 0 {
		log.Printf("找到")
		return x, y
	}
	return 0, 0

}

func FindWord_dm(a, b, c, d int, str string, colorstr string) (int, int) {
	var x, y int
	_ = dm.FindStr(a, b, c, d, str, colorstr, 0.89, &x, &y)
	if x >= 0 && y >= 0 {
		log.Printf("找到")
		return x, y
	}
	return 0, 0
}

func proceess_one(cli string) {
	//找图  33   181818   050505

	x, y := FindPic_dm(112, 0, 925, 44, "44.bmp", "050505", 0)
	//x, y = FindWord_dm(98, 1, 581, 52, "x", "2468f2-4c4a48|b993f3-000000|71c6ff-000000|b993f3-000000|2468f2-000000|247df6-000000")
	fmt.Printf("44的坐标 %d--%d\n", x, y)

	//左点击
	setwindows(handleColl[0])
	_ = dm.MoveTo(x, y)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	time.Sleep(100 * time.Millisecond)
	_ = dm.MoveTo(x, y+60)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	//按down

	for i := 0; i <= 50; i++ {
		dm.KeyDown(40)
	}
	dm.KeyUp(40)
	//找 添加
	x, y = 0, 0
	x, y = FindWord_dm(0, 642, 426, 1046, "添加", "2468f2-4c4a48|b993f3-000000|71c6ff-000000|b993f3-000000|2468f2-000000|247df6-000000")
	fmt.Printf(" 添加的坐标 %d--%d\n", x, y)
	//移动
	setwindows(handleColl[0])
	_ = dm.MoveTo(x, y)

	//点击

	//复制粘贴   gpt4
	// cli := "中问"
	//
	_ = dm.MoveTo(x, y-30)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	time.Sleep(100 * time.Millisecond)
	dm.LeftDoubleClick()
	time.Sleep(200 * time.Millisecond)

	//快捷键  ji   失效
	dm.SendString(handleColl[0], cli)

	_ = dm.MoveTo(x, y)
	time.Sleep(200 * time.Millisecond)
	dm.LeftClick()
	fmt.Println(cli)

}
func proceess_two(cli string) {
	//找x
	x, y := FindPic_dm(112, 0, 925, 44, "55.bmp", "050505", 0)
	fmt.Printf("55的坐标 %d--%d\n", x, y)

	//左点击
	setwindows(handleColl[0])
	_ = dm.MoveTo(x, y)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	time.Sleep(100 * time.Millisecond)
	_ = dm.MoveTo(x, y+60)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	//按down

	for i := 0; i <= 50; i++ {
		dm.KeyDown(40)
	}
	dm.KeyUp(40)
	//找 11.bmp
	x, y = 0, 0
	x, y = FindPic_dm(465, 792, 1712, 1039, "22.bmp", "181818", 0)

	fmt.Printf("22的坐标 %d--%d\n", x, y)
	//移动
	setwindows(handleColl[0])
	//_ = dm.MoveTo(x, y)

	_ = dm.MoveTo(x-30, y-30)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	time.Sleep(100 * time.Millisecond)
	dm.LeftDoubleClick()
	time.Sleep(200 * time.Millisecond)

	//复制粘贴   gpt4
	// cli := "中sss"

	dm.SendString(handleColl[0], cli)
	time.Sleep(200 * time.Millisecond)
	_ = dm.MoveTo(x+10, y+10)
	time.Sleep(200 * time.Millisecond)
	dm.LeftClick()
	fmt.Println(cli)

}
func proceess_there(cli string) {

	//找x
	x, y := FindPic_dm(575, 2, 900, 39, "88.bmp", "050505", 0)
	fmt.Printf("88的坐标 %d--%d\n", x, y)

	//左点击
	setwindows(handleColl[0])
	_ = dm.MoveTo(x, y)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	time.Sleep(100 * time.Millisecond)
	_ = dm.MoveTo(x, y+60)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	//按down

	// for i := 0; i <= 50; i++ {
	// 	dm.KeyDown(40)
	// }
	//dm.KeyUp(40)
	//找 11.bmp
	x, y = 0, 0
	x, y = FindPic_dm(55, 76, 1174, 280, "11.bmp", "050505", 0)

	fmt.Printf("11的坐标 %d--%d\n", x, y)
	//移动
	setwindows(handleColl[0])
	//_ = dm.MoveTo(x, y)

	_ = dm.MoveTo(x+40, y)
	time.Sleep(100 * time.Millisecond)
	dm.LeftClick()
	time.Sleep(100 * time.Millisecond)
	//dm.LeftDoubleClick()
	// time.Sleep(200 * time.Millisecond)

	//复制粘贴   gpt4
	// cli := "中fff"

	dm.SendString(handleColl[0], cli)
	time.Sleep(200 * time.Millisecond)
	_ = dm.MoveTo(x, y)
	time.Sleep(200 * time.Millisecond)
	dm.LeftClick()
	fmt.Println(cli)

}

// test
func setwindows(handle int) {
	dm.SetWindowState(handle, 15)
}

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用Java Native Interface (JNI)实现Golang调用Java。具体步骤如下: 1. 编写Java代码,并将其编译为共享库文件(例如,libmyjava.so)。 2. 在Golang中使用CGO调用JNI库,加载Java类和方法,并调用它们。 以下是一个简单的示例代码,演示如何使用CGO和JNI从Golang调用Java方法: ```go package main // #include <jni.h> import "C" import ( "fmt" "unsafe" ) func main() { // 初始化JVM jvm := startJVM() // 加载Java类 class := jvm.FindClass("com/example/MyClass") // 加载Java方法 method := class.GetMethodID("myMethod", "()Ljava/lang/String;") // 调用Java方法 result := jvm.CallObjectMethod(class, method) // 转换Java字符串为Go字符串 goString := javaStringToGoString(result) fmt.Println(goString) // 关闭JVM stopJVM(jvm) } // 启动JVM func startJVM() *C.JavaVM { var vm *C.JavaVM var env *C.JNIEnv // 设置Java类路径 classpath := C.CString("-Djava.class.path=./") // 设置JVM选项 options := []C.JavaVMOption{ {optionString: classpath}, } // 设置JVM初始化参数 vmArgs := C.JavaVMInitArgs{ version: C.JNI_VERSION_1_8, options: &options[0], nOptions: C.jint(len(options)), ignoreUnrecognized: C.JNI_FALSE, } // 启动JVM C.JNI_CreateJavaVM(&vm, (**C.JNIEnv)(unsafe.Pointer(&env)), unsafe.Pointer(&vmArgs)) return vm } // 关闭JVM func stopJVM(vm *C.JavaVM) { C.JNI_DestroyJavaVM(vm) } // 将Java字符串转换为Go字符串 func javaStringToGoString(jStr C.jobject) string { chars := C.env.GetStringUTFChars(C.jstring(jStr), nil) defer C.env.ReleaseStringUTFChars(C.jstring(jStr), chars) return C.GoString(chars) } // 导出JNI函数 //export Java_com_example_MyClass_myMethod func Java_com_example_MyClass_myMethod(env *C.JNIEnv, obj C.jobject) C.jstring { result := C.CString("Hello from Java!") defer C.free(unsafe.Pointer(result)) return C.env.NewStringUTF(result) } ``` 上述代码中,我们使用了CGO来调用JNI库。在`startJVM`函数中,我们设置了Java类路径和JVM选项,并启动了JVM。在`main`函数中,我们加载了Java类和方法,并调用了它们。在`javaStringToGoString`函数中,我们将Java字符串转换为Go字符串。最后,在`Java_com_example_MyClass_myMethod`函数中,我们导出了一个JNI函数,它将被Golang调用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值