使用Golang的Chromedp模拟发送Ctrl+Alt+Delete组合键

使用Golang的Chromedp模拟发送Ctrl+Alt+Delete组合键 使用 chromedp,我想向特定的浏览器标签页发送 Ctrl+Alt+Delete 组合键,因为远程系统是基于 Windows 的。我想避免输入我那相当长的密码。

我最近尝试的版本是这样的:

chromedp.Run(ctx,
input.DispatchKeyEvent(input.KeyDown).WithKey(kb.Control),
chromedp.Sleep(200*time.Millisecond),

input.DispatchKeyEvent(input.KeyDown).WithKey(kb.Alt),
chromedp.Sleep(200*time.Millisecond),

input.DispatchKeyEvent(input.KeyDown).WithKey(kb.Delete))

在此之前,我尝试过这个:

chromedp.KeyEvent(kb.Control),
chromedp.KeyEvent(kb.Alt),
chromedp.KeyEvent(kb.Delete))

我也尝试过在 Key Event 仅为 delete 时使用按键修饰符,但那也没有成功。

我在浏览器中设置了一个按键监听器,Ctrl+Alt+Delete 没有被捕获,但它确实能锁定和解锁系统。

document.onkeypress = function (e) {
e = e || window.event;
console.log(e.keyCode);
};

我还用这个来捕获元键:

document.addEventListener('keydown', (event) => {
console.log('Meta key pressed:', event.metaKey);
console.log('Alt key pressed:', event.altKey);
console.log('Control key pressed:', event.ctrlKey);
console.log('Shift key pressed:', event.shiftKey);
});

如果我单独按 delete 键,那么我能得到键码,但这是唯一会打印到控制台日志的键。

这可能实现吗?


更多关于使用Golang的Chromedp模拟发送Ctrl+Alt+Delete组合键的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

谢谢,我会去那边问问。

更多关于使用Golang的Chromedp模拟发送Ctrl+Alt+Delete组合键的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你尝试过在他们的代码仓库中创建一个问题吗?我想他们或许能提供帮助,因为这个问题与Go语言本身关系不大,更多是那个特定库的问题。

在 chromedp 中模拟 Ctrl+Alt+Delete 组合键是可行的,但需要正确的实现方式。以下是完整的示例代码:

package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/chromedp"
    "github.com/chromedp/chromedp/kb"
)

func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    err := chromedp.Run(ctx,
        chromedp.Navigate("about:blank"),
        chromedp.Sleep(1*time.Second),
        
        // 按下 Ctrl 键
        chromedp.KeyDown(kb.Control),
        chromedp.Sleep(100*time.Millisecond),
        
        // 按下 Alt 键
        chromedp.KeyDown(kb.Alt),
        chromedp.Sleep(100*time.Millisecond),
        
        // 按下 Delete 键
        chromedp.KeyDown(kb.Delete),
        chromedp.Sleep(100*time.Millisecond),
        
        // 释放 Delete 键
        chromedp.KeyUp(kb.Delete),
        chromedp.Sleep(100*time.Millisecond),
        
        // 释放 Alt 键
        chromedp.KeyUp(kb.Alt),
        chromedp.Sleep(100*time.Millisecond),
        
        // 释放 Ctrl 键
        chromedp.KeyUp(kb.Control),
    )
    
    if err != nil {
        log.Fatal(err)
    }
}

对于更精确的控制,可以使用 input.DispatchKeyEvent

package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/chromedp"
    "github.com/chromedp/chromedp/client"
    "github.com/chromedp/chromedp/input"
)

func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    err := chromedp.Run(ctx,
        chromedp.Navigate("about:blank"),
        chromedp.Sleep(1*time.Second),
        
        // Ctrl 键按下
        input.DispatchKeyEvent(input.KeyDown).
            WithKey("ControlLeft").
            WithModifiers(input.ModifierControl),
        chromedp.Sleep(50*time.Millisecond),
        
        // Alt 键按下
        input.DispatchKeyEvent(input.KeyDown).
            WithKey("AltLeft").
            WithModifiers(input.ModifierControl|input.ModifierAlt),
        chromedp.Sleep(50*time.Millisecond),
        
        // Delete 键按下
        input.DispatchKeyEvent(input.KeyDown).
            WithKey("Delete").
            WithModifiers(input.ModifierControl|input.ModifierAlt),
        chromedp.Sleep(50*time.Millisecond),
        
        // Delete 键释放
        input.DispatchKeyEvent(input.KeyUp).
            WithKey("Delete").
            WithModifiers(input.ModifierControl|input.ModifierAlt),
        chromedp.Sleep(50*time.Millisecond),
        
        // Alt 键释放
        input.DispatchKeyEvent(input.KeyUp).
            WithKey("AltLeft").
            WithModifiers(input.ModifierControl),
        chromedp.Sleep(50*time.Millisecond),
        
        // Ctrl 键释放
        input.DispatchKeyEvent(input.KeyUp).
            WithKey("ControlLeft"),
    )
    
    if err != nil {
        log.Fatal(err)
    }
}

如果需要在特定元素上触发组合键:

package main

import (
    "context"
    "log"
    "time"

    "github.com/chromedp/chromedp"
    "github.com/chromedp/chromedp/kb"
)

func main() {
    ctx, cancel := chromedp.NewContext(context.Background())
    defer cancel()

    err := chromedp.Run(ctx,
        chromedp.Navigate("https://example.com"),
        chromedp.Sleep(2*time.Second),
        
        // 聚焦到 body 元素
        chromedp.Focus("body", chromedp.NodeVisible),
        chromedp.Sleep(100*time.Millisecond),
        
        // 发送组合键
        chromedp.KeyDown(kb.Control),
        chromedp.Sleep(50*time.Millisecond),
        chromedp.KeyDown(kb.Alt),
        chromedp.Sleep(50*time.Millisecond),
        chromedp.KeyDown(kb.Delete),
        chromedp.Sleep(50*time.Millisecond),
        chromedp.KeyUp(kb.Delete),
        chromedp.Sleep(50*time.Millisecond),
        chromedp.KeyUp(kb.Alt),
        chromedp.Sleep(50*time.Millisecond),
        chromedp.KeyUp(kb.Control),
    )
    
    if err != nil {
        log.Fatal(err)
    }
}

这些示例代码展示了在 chromedp 中正确模拟 Ctrl+Alt+Delete 组合键的方法。关键点包括正确的按键顺序、适当的延迟以及确保每个按键都有对应的释放操作。

回到顶部