【问题标题】:Display text on another process' screen (overlay)在另一个进程的屏幕上显示文本(覆盖)
【发布时间】:2020-08-13 14:18:35
【问题描述】:

我有一个问题,它更像是一个基于操作系统的问题。

我正在玩一个视频游戏,我希望能够在游戏屏幕上放置一个文本计时器,就好像它是游戏本身的一部分一样。

现在,我可以用任何语言编写一个程序,在屏幕上显示一个带有计时器的 TextBox,但如果我运行它,游戏进程(我们称之为 game.exe)“失去”焦点,我得到了我的由操作系统聚焦和交互的文本框。

是否有任何选项可以显示来自完全不同进程的 game.exe 的“顶部”文本?好像屏幕上有“层”。此外,此文本不应难以处理、可点击或使 game.exe 进程失去焦点。

这是我画的一个非常简单的例子:

非常感谢!

【问题讨论】:

    标签: windows process


    【解决方案1】:

    使用 python 和 tkinter 的窗口技巧和一些 windows api 东西解决了这个问题。 诀窍是创建一个透明的不可点击的窗口并始终保持在顶部。 我基本上将this 答案与一些更简单的东西结合起来,比如删除窗口的边框并设置为自动全屏。

    from tkinter import *
    import time
    import win32gui
    import win32api
    
    from win32api import GetSystemMetrics
    # WIDTH = 500
    # HEIGHT = 500
    
    WIDTH = GetSystemMetrics(0)
    HEIGHT = GetSystemMetrics(1)
    LINEWIDTH = 1
    TRANSCOLOUR = 'gray'
    title = 'Virtual whiteboard'
    global old
    old = ()
    global HWND_t
    HWND_t = 0
    
    tk = Tk()
    # tk.title(title)
    tk.lift()
    tk.wm_attributes("-topmost", True)
    tk.wm_attributes("-transparentcolor", TRANSCOLOUR)
    tk.attributes('-fullscreen', True)
    
    
    state_left = win32api.GetKeyState(0x01)  # Left button down = 0 or 1. Button up = -127 or -128
    
    canvas = Canvas(tk, width=WIDTH, height=HEIGHT, highlightthickness=0)
    canvas.pack()
    canvas.config(cursor='tcross')
    canvas.create_rectangle(0, 0, WIDTH, HEIGHT, fill=TRANSCOLOUR, outline=TRANSCOLOUR)
    canvas.create_text(WIDTH/2,HEIGHT/2,fill="white",font="Arial 20", text="TEXT GOES HERE")
    
    def putOnTop(event):
        event.widget.unbind('<Visibility>')
        event.widget.update()
        event.widget.lift()
        event.widget.bind('<Visibility>', putOnTop)
    def drawline(data):
        global old
        if old !=():
            canvas.create_line(old[0], old[1], data[0], data[1], width=LINEWIDTH)
        old = (data[0], data[1])
    
    def enumHandler(hwnd, lParam):
        global HWND_t
        if win32gui.IsWindowVisible(hwnd):
            if title in win32gui.GetWindowText(hwnd):
                HWND_t = hwnd
    
    win32gui.EnumWindows(enumHandler, None)
    
    tk.bind('<Visibility>', putOnTop)
    tk.focus()
    
    running = 1
    while running == 1:
        try:
            tk.update()
            time.sleep(0.01)
            if HWND_t != 0:
                windowborder = win32gui.GetWindowRect(HWND_t)
                cur_pos = win32api.GetCursorPos()
                state_left_new = win32api.GetKeyState(0x01)
                if state_left_new != state_left:
                    if windowborder[0] < cur_pos[0] and windowborder[2] > cur_pos[0] and windowborder[1] < cur_pos[1] and windowborder[3] > cur_pos[1]:
                        drawline((cur_pos[0] - windowborder[0] - 5, cur_pos[1] - windowborder[1] - 30))
                else:
                    old = ()
        except Exception as e:
            running = 0
            print("error %r" % (e))
    

    【讨论】:

      猜你喜欢
      • 2010-12-28
      • 2011-05-23
      • 2021-06-04
      • 2017-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多