8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

在 ubuntu 22.04 wayland 中获取窗口的屏幕截图和标题/应用程序名称

B''H Bi'ezras -- Boruch Hashem 2月前

73 0

有一个 Linux 应用程序可以收集当前 GUI 会话中的活动:每次它都会截取屏幕截图并记下焦点窗口的名称(标题)...

有一个 Linux 应用程序会收集当前 GUI 会话中的活动:每次它都会截取一次屏幕截图并记下焦点窗口的名称(标题)以及启动此窗口的应用程序的名称。该应用程序的工作方式就像会话在 x11 中运行一样。现在我们需要添加对应用程序在 Ubuntu 22.04 上的 wayland 环境中运行的支持。

在 wayland 环境中截取屏幕截图 gnome dbus API ,但每次都会弹出一次“与请求应用程序共享此屏幕截图”窗口。 我尝试修复的问题: 此处的 屏幕截图方法, 这里 所述 。我读到过某处说,如果您使用此 API 而不是 (1),则不会弹出任何窗口。这不是真的吗?

获取应用程序的标题/名称 Eval ,但在 ubuntu 22.04 上,这仅在不安全模式下有效。 我尝试修复的内容: 这里 有一个不使用 Eval 获取应用程序标题/名称的示例,但它给出了错误,如 这里 。我还 发现 带有代码的示例可以正确确定应用程序的标题/名称,但并非适用于所有窗口。

总的来说,该应用程序应该能够在 ubuntu 22.04 wayland 上做两件事:

  • 截取屏幕截图时不会出现屏幕闪烁或弹出消息。
  • 接收焦点窗口的标题和应用程序名称,无需进入不安全模式

这能实现吗?

更新: 我在这里阅读 https://askubuntu.com/a/1437333/1102308 ,这些问题可以通过创建自己的 gnome shell 扩展来解决,并在此扩展中接收标题/应用程序名称并将其从扩展传递到我的应用程序。这是真的吗?

帖子版权声明 1、本帖标题:在 ubuntu 22.04 wayland 中获取窗口的屏幕截图和标题/应用程序名称
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由B''H Bi'ezras -- Boruch Hashem在本站《ubuntu》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我已经将 Ubuntu 从 20.04 升级到 24.04,并且我的服务器上安装了多个版本的 phpsudo update-alternatives --config php所以问题是我无法在 php 上安装 php-memcached...

    我已经将 Ubuntu 从 20.04 升级到 24.04,并且我的服务器上安装了多个版本的 php

    sudo update-alternatives --config php

    enter image description here

    所以问题是我无法在 php7.4 版本上安装 php-memcached

    我试过

    apt install php7.4-memcached

    但它给出了错误 E: Unable to locate package php7.4-memcached E: Couldn't find any package by glob 'php7.4-memcached'

    在此之后,我尝试 apt install php-memcached

    apt-cache search memcached | grep PHP
    

    给出这个:

    enter image description here

    问题是它只为 php 8.3 安装 memcached 扩展

    如何强制为 PHP 7.3 安装 php-memcached?

  • 我正在尝试在 Ubuntu 20.04 上全局安装 Puppeteer(https://pptr.dev/):$ sudo npm install puppeteer -g 我收到此错误消息:npm 错误代码 1npm 错误路径 /usr/local/lib/node_mod...

    在 Ubuntu 20.04 上全局 https://pptr.dev/ https://pptr.dev/

    $ sudo npm install puppeteer -g
    

    我收到此错误消息:

    npm error code 1
    npm error path /usr/local/lib/node_modules/puppeteer
    npm error command failed
    npm error command sh -c node install.mjs
    npm error A complete log of this run can be found in: /root/.npm/_logs/2024-05-03T19_37_45_119Z-debug-0.log
    

    我的node版本是v18.20.2我的npm版本是10.5.0

    什么原因可能导致这个错误?

  • 我是 Unity 和 C# 的新手。我遇到了一些问题。当我的角色使用“touchmove”移动时,我使用“武器”发射“projectilePrefab”。但是,当我实际触摸并移动角色时,我遇到了一些问题。

    我是 Unity 和 C# 的新手。我遇到了一些问题。当我的角色使用“touchmove”移动时,我使用“武器”发射“projectilePrefab”。但是,当我实际触摸并移动角色时,我遇到了“projectilePrefab”发射速度过快的问题。请帮帮我吧

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Weapon : MonoBehaviour
    {
        [SerializeField]
        private GameObject projectilePrefab;
        [SerializeField]
        private float attackRate = 0.5f;
    
        
        public void StartFiring()
        {
            StartCoroutine("TryAttack");
        }
    
        public void StopFiring()
        {
            StopCoroutine("TryAttack");
        }
    
        private IEnumerator TryAttack()
        {
            while ( true)
            {
                Instantiate(projectilePrefab, transform.position, Quaternion.identity);
    
                yield return new WaitForSeconds(attackRate);
            }
        }
    
       
    }
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class TouchMove : MonoBehaviour
    {
        private Vector3 touchPosition;
        private Rigidbody2D rb;
        private Vector3 direction;
        private float moveSpeed = 10f;
        private Weapon weapon;
    
        private void Awake() 
        {
           weapon = GetComponent<Weapon>();    
        }
    
        private void Start() 
        {
            rb = GetComponent<Rigidbody2D>();
        }
    
        private void Update()
        {
            if(Input.touchCount > 0)
            {
                Touch touch = Input.GetTouch(0);
                touchPosition = Camera.main.ScreenToWorldPoint(touch.position);
                touchPosition.z = 0;
                direction = (touchPosition - transform.position);
                rb.velocity = new Vector2(direction.x, direction.y) * moveSpeed;
                weapon.StartFiring();
    
                if (touch.phase == TouchPhase.Ended)
                    rb.velocity = Vector2.zero;
                    weapon.StopFiring();
            }
        }
    }
    

    我想要确保 \'projectilePrefab\' 的发射速度以 0.5f 发射,这是我设置的发射速度。

  • 您需要仔细阅读收到的错误消息,然后逐一修复它们才能进行编译,这并不难,祝你好运!

  • 谢谢!另外,编译时需要 apt install libmemcached-dev

  • 我推测你可能正在使用 ondrej/sury PPA,它不包含 24.04 Noble 的 memcached 模块的预编译版本。因此,你必须自己编译它。以 root 身份:

    pecl install memcached
    echo "extension=memcached.so" > /etc/php/7.4/mods-available/memcached.ini 
    phpenmod -v 7.4 memcached
    

    如果您还想为其他 PHP 版本安装它,您需要先删除 PECL 注册表,以免它认为它已安装:

    rm /usr/share/php/.registry/.channel.pecl.php.net/memcached.reg
    
  • StackOverflow 主要用于解决编程问题。如果你没有得到答案,可以尝试

  • npm install --ignore-scripts puppeteer 对我有用。

  • 引用 10

    我在 Ubuntu 22.04、Node 20.11.1 和 npm 10.2.4 上工作正常,但我没有

  • 由于触发速度过快,您可能启动了多个 TryAttack() 协程实例。以下是一些应该有帮助的事情。

    1. StopCoroutine(\'TryAttack\') 只会停止它找到的第一个协程。如果您正在运行多个协程,它不会停止所有协程。
    2. StartCoroutine() 是无人看管的,它有可能启动许多协同程序,而且由于您没有将它们存储在任何地方,因此它们将更难被引用。
    3. 很难确切地说出你试图用 Input.touchCount 做什么。Update() 每帧运行一次,因此 weapons.StartFiring() 运行多次,而 weapons.StopFiring() 在触摸端只运行一次。Unity 的文档中有一些有用的示例: https://docs.unity3d.com/ScriptReference/Input.GetTouch.html .

    来自文档 - 尝试使用 TouchPhase.Began 开始射击并使用 TouchPhase.Ended 停止。

    if (Input.touchCount > 0)
    {
        touch = Input.GetTouch(0);
    
        if (touch.phase == TouchPhase.Began)
        {
            // Start Firing
            weapon.StartFiring();
        }
    
        if (touch.phase == TouchPhase.Ended)
        {
            // Stop Firing
            weapon.StopFiring();
        }
    }
    

    考虑类似这样的方法以防止武器启动比预期更多的协同程序。

    public class Weapon : Monobehavior 
    {
        private Coroutine FireRoutine;
    
        public void StartFiring() 
        {
            if (FireRoutine == null)
                FireRoutine = StartCoroutine("TryAttack");
        }
    
        public void StopFiring() 
        {
            if (FireRoutine != null) 
            {
                StopCoroutine(FireRoutine);
                FireRoutine = null;
            }
        }
    }
    
返回
作者最近主题: