python如何显示文本_如何在没有使用Python的窗口的情况下在屏幕上显示文本

事实证明,这里有两个完全不同的问题.要在窗口上显示文本,您需要创建一个未修饰的最顶层窗口,并为背景创建色度键.但是,当运行全屏应用程序(例如游戏)时,这将不起作用.在全屏应用程序上显示文本的唯一可靠方法是使用Direct3D挂钩.

我没有写过Direct3D钩子的例子,但我会给第一个问题提供两种不同的解决方案.

解决方案1:Tkinter pywin32

在这个例子中,我使用Tkinter进行大部分工作,并使用win32api来阻止文本阻止鼠标点击.如果您无法使用win32api,那么您可以删除该部分代码.

import Tkinter, win32api, win32con, pywintypes

label = Tkinter.Label(text='Text on the screen', font=('Times New Roman','80'), fg='black', bg='white')

label.master.overrideredirect(True)

label.master.geometry("+250+250")

label.master.lift()

label.master.wm_attributes("-topmost", True)

label.master.wm_attributes("-disabled", True)

label.master.wm_attributes("-transparentcolor", "white")

hWindow = pywintypes.HANDLE(int(label.master.frame(), 16))

# http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx

# The WS_EX_TRANSPARENT flag makes events (like mouse clicks) fall through the window.

exStyle = win32con.WS_EX_COMPOSITED | win32con.WS_EX_LAYERED | win32con.WS_EX_NOACTIVATE | win32con.WS_EX_TOPMOST | win32con.WS_EX_TRANSPARENT

win32api.SetWindowLong(hWindow, win32con.GWL_EXSTYLE, exStyle)

label.pack()

label.mainloop()

解决方案2:pywin32

这个例子通过pywin32完成所有事情.这使得它更复杂,更不便携,但功能更强大.我在整个代码中都包含了指向Windows API相关部分的链接.

import win32api, win32con, win32gui, win32ui

def main():

hInstance = win32api.GetModuleHandle()

className = 'MyWindowClassName'

# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633576(v=vs.85).aspx

# win32gui does not support WNDCLASSEX.

wndClass = win32gui.WNDCLASS()

# http://msdn.microsoft.com/en-us/library/windows/desktop/ff729176(v=vs.85).aspx

wndClass.style = win32con.CS_HREDRAW | win32con.CS_VREDRAW

wndClass.lpfnWndProc = wndProc

wndClass.hInstance = hInstance

wndClass.hCursor = win32gui.LoadCursor(None, win32con.IDC_ARROW)

wndClass.hbrBackground = win32gui.GetStockObject(win32con.WHITE_BRUSH)

wndClass.lpszClassName = className

# win32gui does not support RegisterClassEx

wndClassAtom = win32gui.RegisterClass(wndClass)

# http://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx

# Consider using: WS_EX_COMPOSITED, WS_EX_LAYERED, WS_EX_NOACTIVATE, WS_EX_TOOLWINDOW, WS_EX_TOPMOST, WS_EX_TRANSPARENT

# The WS_EX_TRANSPARENT flag makes events (like mouse clicks) fall through the window.

exStyle = win32con.WS_EX_COMPOSITED | win32con.WS_EX_LAYERED | win32con.WS_EX_NOACTIVATE | win32con.WS_EX_TOPMOST | win32con.WS_EX_TRANSPARENT

# http://msdn.microsoft.com/en-us/library/windows/desktop/ms632600(v=vs.85).aspx

# Consider using: WS_DISABLED, WS_POPUP, WS_VISIBLE

style = win32con.WS_DISABLED | win32con.WS_POPUP | win32con.WS_VISIBLE

# http://msdn.microsoft.com/en-us/library/windows/desktop/ms632680(v=vs.85).aspx

hWindow = win32gui.CreateWindowEx(

exStyle,

wndClassAtom,

None, # WindowName

style,

0, # x

0, # y

win32api.GetSystemMetrics(win32con.SM_CXSCREEN), # width

win32api.GetSystemMetrics(win32con.SM_CYSCREEN), # height

None, # hWndParent

None, # hMenu

hInstance,

None # lpParam

)

# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633540(v=vs.85).aspx

win32gui.SetLayeredWindowAttributes(hWindow, 0x00ffffff, 255, win32con.LWA_COLORKEY | win32con.LWA_ALPHA)

# http://msdn.microsoft.com/en-us/library/windows/desktop/dd145167(v=vs.85).aspx

#win32gui.UpdateWindow(hWindow)

# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633545(v=vs.85).aspx

win32gui.SetWindowPos(hWindow, win32con.HWND_TOPMOST, 0, 0, 0, 0,

win32con.SWP_NOACTIVATE | win32con.SWP_NOMOVE | win32con.SWP_NOSIZE | win32con.SWP_SHOWWINDOW)

# http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx

#win32gui.ShowWindow(hWindow, win32con.SW_SHOW)

win32gui.PumpMessages()

def wndProc(hWnd, message, wParam, lParam):

if message == win32con.WM_PAINT:

hdc, paintStruct = win32gui.BeginPaint(hWnd)

dpiScale = win32ui.GetDeviceCaps(hdc, win32con.LOGPIXELSX) / 60.0

fontSize = 80

# http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037(v=vs.85).aspx

lf = win32gui.LOGFONT()

lf.lfFaceName = "Times New Roman"

lf.lfHeight = int(round(dpiScale * fontSize))

#lf.lfWeight = 150

# Use nonantialiased to remove the white edges around the text.

# lf.lfQuality = win32con.NONANTIALIASED_QUALITY

hf = win32gui.CreateFontIndirect(lf)

win32gui.SelectObject(hdc, hf)

rect = win32gui.GetClientRect(hWnd)

# http://msdn.microsoft.com/en-us/library/windows/desktop/dd162498(v=vs.85).aspx

win32gui.DrawText(

hdc,

'Text on the screen',

-1,

rect,

win32con.DT_CENTER | win32con.DT_NOCLIP | win32con.DT_SINGLELINE | win32con.DT_VCENTER

)

win32gui.EndPaint(hWnd, paintStruct)

return 0

elif message == win32con.WM_DESTROY:

print 'Closing the window.'

win32gui.PostQuitMessage(0)

return 0

else:

return win32gui.DefWindowProc(hWnd, message, wParam, lParam)

if __name__ == '__main__':

main()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值