go+govcl+go-ole实现的windows远程桌面

jjmgx · 2020-05-25 17:23:25 · 8093 次点击 · 预计阅读时间 2 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2020-05-25 17:23:25 的文章,其中的信息可能已经有所发展或是发生改变。

一直用go写后台服务用,几乎没有写过gui程序,近日对各种的golang的gui库了解了一下,最后选择了用govcl试试,感觉还是不错的。用起来很顺手,下面把我写的基于MsTscAx控件的远程桌面程序发出来和大家共享下,一共就50行代码, 效果图如下: image.png

package main

import (
    "syscall"
    "unsafe"

    "github.com/ying32/govcl/vcl/types/colors"

    "github.com/go-ole/go-ole"
    "github.com/go-ole/go-ole/oleutil"
    _ "github.com/ying32/govcl/pkgs/winappres"
    "github.com/ying32/govcl/vcl"
)

var Form1 *TForm1
var atlDll = syscall.NewLazyDLL("atl.dll")
var AtlAxAttachControl = atlDll.NewProc("AtlAxAttachControl")

func main() {
    vcl.Application.Initialize()
    vcl.Application.CreateForm(&Form1)
    vcl.Application.Run()
}

type TForm1 struct {
    *vcl.TForm
    Rdp1 RdpPanel
}

type RdpPanel struct {
    *vcl.TPanel
    rdp *ole.IDispatch
}

func (f *TForm1) OnFormCreate(sender vcl.IObject) {
    f.SetCaption("windows远程桌面")
    f.SetBounds(10, 10, 1024, 800)
    f.Rdp1.Initrdp(f, 0, 0, 1024, 768, "192.168.2.28", "administrator", "pass")
}

func (rp *RdpPanel) Initrdp(f *TForm1, x, y, w, h int32, ip, username, pass string) {
    ole.CoInitialize(0)
    rp.TPanel = vcl.NewPanel(f)
    rp.SetParent(f)
    rp.SetBounds(x, y, w, h)
    rp.SetParentBackground(false)
    rp.SetColor(colors.ClRed)
    unknown, _ := oleutil.CreateObject("MsTscAx.MsTscAx.2")
    rp.rdp = unknown.MustQueryInterface(ole.IID_IDispatch)
    AtlAxAttachControl.Call(uintptr(unsafe.Pointer(&unknown.RawVTable)), rp.Handle(), 0)
    oleutil.PutProperty(rp.rdp, "server", ip)
    oleutil.PutProperty(rp.rdp, "username", username)
    set, _ := oleutil.GetProperty(rp.rdp, "AdvancedSettings")
    set.ToIDispatch().PutProperty("ClearTextPassword", pass)
    oleutil.MustCallMethod(rp.rdp, "connect")
    ole.CoUninitialize()
}

最后,如果也有用govcl的小伙伴,希望能提供一下支持多标签页的方法。不胜感激~


有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

8093 次点击  ∙  2 赞  
加入收藏 微博
12 回复  |  直到 2022-05-07 12:27:51
ying32
ying32 · #1 · 5年之前

多标签用TPageControl就好了

jjmgx
jjmgx · #2 · 5年之前
ying32ying32 #1 回复

多标签用TPageControl就好了

TPageControl我方了没有带关闭按钮,是否有什么方法可以实现?

ying32
ying32 · #3 · 5年之前
jjmgxjjmgx #2 回复

#1楼 @ying32 TPageControl我方了没有带关闭按钮,是否有什么方法可以实现?

在TPageControl的OnMouseUp事件中判断鼠标按键+判断Y坐标,然后弹出个TPopupMenu

jjmgx
jjmgx · #4 · 5年之前
ying32ying32 #3 回复

#2楼 @jjmgx 在TPageControl的OnMouseUp事件中判断鼠标按键+判断Y坐标,然后弹出个TPopupMenu

谢谢指教!

felix328
felix328 · #5 · 5年之前

你是作者吗

felix328
felix328 · #6 · 5年之前

楼主你的源码能给一下吗,还有liblcl.dll

jjmgx
jjmgx · #7 · 4年之前
felix328felix328 #6 回复

楼主你的源码能给一下吗,还有liblcl.dll

源码就上面的那么多。liblcl.dll可以到github.com/ying32/govcl/vcl下载

TomLiu-GitHub
TomLiu-GitHub · #8 · 4年之前

能帮我看下这个问题吗 https://github.com/go-ole/go-ole/issues/209 不知道enum对象如何初始化

daikin
daikin · #9 · 3年之前

这个DEMO有个BUG 远程桌面连接成功后,如果在WINDOWS里切换到其它的窗口再切换回远程桌面则会出现鼠标键盘向远程桌面输入失效~ 麻烦作者试下!本人小白不知道如果解决,已经折磨了两天了. 谢谢作者

jjmgx
jjmgx · #10 · 3年之前
daikindaikin #9 回复

这个DEMO有个BUG 远程桌面连接成功后,如果在WINDOWS里切换到其它的窗口再切换回远程桌面则会出现鼠标键盘向远程桌面输入失效~ 麻烦作者试下!本人小白不知道如果解决,已经折磨了两天了. 谢谢作者

我测试正常!

daikin
daikin · #11 · 3年之前

1楼 @ying32 这个DEMO 远程桌面连接成功后,如果在WINDOWS里切换到其它的窗口再切换回远程桌面则会出现鼠标键盘向远程桌面输入失效~请指导

# Form1.Rdp1.SetOnClick(func(sender vcl.IObject) { fmt.Println("sadfas") Form1.Rdp1.SetFocus() })

Form1.TForm.SetOnClick(func(sender vcl.IObject) {
    Form1.TForm.SetFocus()
})
Form1.TForm.SetOnActivate(func(sender vcl.IObject) {
    fmt.Println("asdfasdf")
})

这样都无效

daikin
daikin · #12 · 3年之前

9楼 @daikin 经过几天的测试以及资料的搜索,发现该问题与 APP 运行的宿主机系统版本有关,WIN7系统确实存在该问题,WIN7以上系统则正常!

该问题的描述及解决: https://support.cloudshare.com/hc/en-us/articles/200281639-Fix-RDP-access-is-visible-but-frozen-when-window-focus-is-changed

终于知道问题的原因在哪里了.

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传