如何用golang远程控制浏览器

浏览器作为现代桌面UI应用已经成为一个强大的存在,网上有很多关于webview的,但是作为操作系统自带的浏览器也是一个很重要的应用场景,如何控制浏览器界面,还有一种思路,采用窗体句柄的方式(内部控制还在摸索中,目前通过子窗体遍历好像不能获取URL),获取窗体句柄后就可以对其发消息,设置窗体显示属性,实现控制

func (_this *UIWebExtern) Init(msg Message) *UIWebExtern {OpenWithBrowser(msg.Noticeurl)time.Sleep(1 * time.Second)_this.c = make(chan int)var hWnd win.HWNDfor {hwnd, err := GetWindowHwndByName("msedge.exe")if err == nil {hWnd = win.HWND(unsafe.Pointer(hwnd))if IsMyWindowsHwnd(hWnd) {_this.Hwnd = hWndbreak}}hwnd, err = GetWindowHwndByName("chrome.exe")if err == nil {hWnd = win.HWND(unsafe.Pointer(hwnd))if IsMyWindowsHwnd(hWnd) {_this.Hwnd = hWndbreak}}hwnd, err = GetWindowHwndByName("msedge.exe")if err == nil {hWnd = win.HWND(unsafe.Pointer(hwnd))if IsMyWindowsHwnd(hWnd) {_this.Hwnd = hWndbreak}}hwnd, err = GetWindowHwndByName("firfox.exe")if err == nil {hWnd = win.HWND(unsafe.Pointer(hwnd))if IsMyWindowsHwnd(hWnd) {_this.Hwnd = hWndbreak}}hwnd, err = GetWindowHwndByName("QQBrowser.exe")if err == nil {hWnd = win.HWND(unsafe.Pointer(hwnd))if IsMyWindowsHwnd(hWnd) {_this.Hwnd = hWndbreak}}hwnd, err = GetWindowHwndByName("360Browser.exe")if err == nil {hWnd = win.HWND(unsafe.Pointer(hwnd))if IsMyWindowsHwnd(hWnd) {_this.Hwnd = hWndbreak}}time.Sleep(2 * time.Second)}style := win.GetWindowLong(_this.Hwnd, win.GWL_STYLE)if msg.NoBorder {style &= ^win.WS_SIZEBOX & ^win.WS_CAPTION} else {style |= win.WS_SIZEBOX | win.WS_CAPTION}win.MoveWindow(_this.Hwnd, int32(msg.UIpos.Startx), int32(msg.UIpos.Starty), int32(msg.UIpos.Width), int32(msg.UIpos.Height), true)if msg.TopMost {fmt.Print("TopMost\n")_this.bTopMost = truewin.SetWindowPos(_this.Hwnd, win.HWND_TOPMOST, 0, 0, 0, 0, win.SWP_NOMOVE|win.SWP_NOSIZE)} else {win.SetWindowPos(_this.Hwnd, win.HWND_NOTOPMOST, 0, 0, 0, 0, win.SWP_NOMOVE|win.SWP_NOSIZE)}win.SetWindowLong(_this.Hwnd, win.GWL_STYLE, style)if msg.FullScreen {win.SendMessage(_this.Hwnd, win.WM_KEYDOWN, 0x0000007A, 0x20380001)//time.Sleep(1 * time.Second)win.SendMessage(_this.Hwnd, win.WM_KEYUP, 0x0000007A, 0x003C0001)}GetCurrentUrl(_this.Hwnd)return _this}func OpenWithBrowser(url string) error {switch runtime.GOOS {case "linux":return exec.Command("xdg-open", url).Start()case "windows":return exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()case "darwin":return exec.Command("open", url).Start()default:return fmt.Errorf("runtime.GOOS %s is not supported", runtime.GOOS)}}func GetWindowHwndByName(name string) (uintptr, error) {proc, err := FindProcessByName(name)if err != nil {return 0, err}hwnd, err := GetWindowHwndByPID(proc.ProcessID)if err != nil {return 0, err}return hwnd, nil}func GetWindowHwndByPID(dwProcessID int) (uintptr, error) {//func  PostKey(key uint8) (uintptr, error) {var user32 = syscall.NewLazyDLL("user32.dll")//var p *os.ProcessPid := dwProcessIDEnumWindows := func(enumFunc uintptr, lparam uintptr) {user32.NewProc("EnumWindows").Call(uintptr(enumFunc), uintptr(lparam))}var hwnd uintptrcb := syscall.NewCallback(func(h uintptr, prm uintptr) uintptr {var itr_pid uint32itr_pid = 0x0001user32.NewProc("GetWindowThreadProcessId").Call(uintptr(h), uintptr(unsafe.Pointer(&itr_pid)))if int(itr_pid) == Pid {hwnd = h//return hwnd//user32.NewProc("PostMessageW").Call(h, 0x0100, uintptr(key), 0)return 0 // stop enumeration (commented to make sure all windows created by our process get's the message)}return 1 // continue enumeration})EnumWindows(cb, 0)if hwnd == 0 {return 0, fmt.Errorf("No window with pid %d found", Pid)}return hwnd, nil}

如何用golang远程控制浏览器相关推荐

  1. 如何用mac远程控制windows10

    如何用mac远程控制windows10 下载Microsoft Remote Desktop 配置Windows10 回到Mac 下载Microsoft Remote Desktop 购买一个美国的a ...

  2. 如何用qq远程桌面链接到计算机,如何用qq远程控制电脑_qq怎么远程连接对方的电脑-win7之家...

    在qq上,出了个远程控制电脑的功能,该功能是很早就出了,但还是不是那么的经常使用到,也有时是用的到该功能的,会有用户不知道怎么使用该功能,那么如何用qq远程控制电脑呢,下面小编给大家分享qq远程连接对 ...

  3. 怎么用python启动谷歌浏览器_如何用python控制浏览器

    selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口.selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web ...

  4. 区块链浏览器_如何用区块链浏览器实现链上数据追踪?

    "支付宝转个账还能有交易回执,京东白条被盗刷了还能去找平台,交易没有任何国家信用背书的虚拟货币的用户,是如何确认自己完成了交易的?在没有第三方平台的情况下,如何实现链上数据追踪?" ...

  5. 区块链浏览器_区块链FBI——如何用区块链浏览器追踪链上数据

    日前,人民数字捐赠溯源平台日前已经上线.该平台是由人民日报数字传播(上海)有限公司发起的非营利公益性平台.平台上可实时查询捐赠的进度与记录,所有流程都将采用区块链技术存证,不可篡改不可伪造,从而保证全 ...

  6. 如何用js获取浏览器URL中查询字符串的参数

    首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...

  7. 如何用栈实现浏览器的前进和后退?

    2019 年第 79 篇文章,总第 103 篇文章 数据结构与算法系列的第四篇文章,前三篇文章: 前言 浏览器的前进和后退功能怎么用栈来实现呢? 这里先介绍一下栈的定义和实现,并介绍它的一些常用的应用 ...

  8. 如何用golang获取linux上文件的访问/创建/修改时间

    在linux上想获取文件的元信息,我们需要使用系统调用lstat或者stat. 在golang的os包里已经把stat封装成了Stat函数,使用它比使用syscall要方便不少. 这是os.Stat的 ...

  9. 电脑怎么远程控制另一台电脑_如何用手机远程控制电脑?

    在日常生活中 你的女神或暗恋对象电脑突然遇到了问题 软萌萌地来求助你 这个时候 如果不(te) 动 (bie) 声 (ji )色 (dong )地分分钟解决掉 那岂不是被夸上天? 然后 你转身离去 深 ...

  10. python浏览器怎么设置_如何用python控制浏览器

    selenium从2.0开始集成了webdriver的API,提供了更简单,更简洁的编程接口.selenium webdriver的目标是提供一个设计良好的面向对象的API,提供了更好的支持进行web ...

最新文章

  1. java if 没有_java – 如何做一个决定没有if语句
  2. AutoCAD安装失败怎样卸载重新安装AutoCAD,解决AutoCAD安装失败的方法总结
  3. VCS-bilibili教程篇1-Debug Basic
  4. java 模拟登陆exe_Java简单模拟登陆和爬虫实例---博客园老牛大讲堂
  5. java 方法调用绑定
  6. comboBox.DataSource绑定
  7. ASP.NET Core之跨平台的实时性能监控(2.健康检查)
  8. 批量提取文件创建时间_批量采集新浪微博用户内容
  9. PowerDesigner-快速入门(极简教程)
  10. 备战双 11!96秒,100亿,支付宝万级规模 K8s 集群管理系统如何设计?
  11. mysql2008 密钥_怎么查看sql server 2008密钥
  12. Mysql 配置文件常见配置
  13. 首页css命名,常用的CSS命名规则
  14. 电子签章引入jar包
  15. Python:体脂计算
  16. word论文排版操作
  17. tflearn在tensorflow上的安装配置(基于ubuntu)
  18. 51单片机数码管显示60秒倒计时(C语言)
  19. 计算机竞赛进省队可以保送吗,厉害!物理竞赛8名学子入选省队!信息学竞赛5人获清北保送资格,他们来自……...
  20. CentOS使用yum命令安装软件失败,报错“Couldn‘t open file /data/ceph/ceph/repodata/repomd.xml“

热门文章

  1. Linux下新增、启动、删除系统服务常用命令
  2. 巨潮资讯网上市公司股票讯息批量下载
  3. 致远OA A6 员工敏感信息泄露
  4. java datasource 详解_Spring的datasource配置详解
  5. 小米路由器 mini 重新刷回官方固件
  6. 2021年茶艺师(中级)考试题库及茶艺师(中级)报名考试
  7. 百度搜索引擎关键字URL采集爬虫优化行业定投方案高效获得行业流量-代码篇
  8. Blend for Visual Studio
  9. vba手机号码归属_国庆献礼-EXCEL自定义函数获取手机号码归属地及运营商信息 | Excel实例教学网 微信公众号EXCEL880...
  10. 【Linux应用】Clonezilla使用指南