我正在尝试实现双缓冲但它似乎不起作用,即图形仍然闪烁.
每次鼠标移动时都会调用WM_PAINT.(WM_MOUSEMOVE)
粘贴WM_PAINT如下:
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rect;
GetClientRect(hWnd, &rect);
int width=rect.right;
int height=rect.bottom;
HDC backbuffDC = CreateCompatibleDC(hdc);
HBITMAP backbuffer = CreateCompatibleBitmap( hdc, width, height);
int savedDC = SaveDC(backbuffDC);
SelectObject( backbuffDC, backbuffer );
HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255));
FillRect(backbuffDC,&rect,hBrush);
DeleteObject(hBrush);
if(fileImport)
{
importFile(backbuffDC);
}
if(renderWiredCube)
{
wireframeCube(backbuffDC);
}
if(renderColoredCube)
{
renderColorCube(backbuffDC);
}
BitBlt(hdc,0,0,width,height,backbuffDC,0,0,SRCCOPY);
RestoreDC(backbuffDC,savedDC);
DeleteObject(backbuffer);
DeleteDC(backbuffDC);
EndPaint(hWnd, &ps);
}
Run Code Online (Sandbox Code Playgroud) 我已经google了一段时间,但找不到用于创建和显示窗口的python3 ctypes和Win32 API的简单示例.请指出我的好链接或显示代码.
提前致谢!
使用python,我想获得一个窗口标题,一个股票软件窗口.
当我浏览另一个股票时,窗口的标题会改变,现在我想每100ms扫描一次并返回新标题,但是窗口标题中的前面文本是相同的文本.
我可以在cmd中打印标题,但我不知道如何每100ms扫描一次并返回
我用这个代码:
from win32gui import * import re
titles = set()
titlekey = ''
def foo(hwnd,nouse):
if IsWindow(hwnd) and IsWindowEnabled(hwnd) and IsWindowVisible(hwnd):
titles.add(GetWindowText(hwnd))
EnumWindows(foo, 0)
lt = [t for t in titles if t]
lt.sort()
for t in lt:
if re.match(titlekey,t):
print t
Run Code Online (Sandbox Code Playgroud)
如何扫描每100毫秒并在更改时返回新标题?
经过几个小时的谷歌搜索,我设法"写"这个:
import win32gui
from ctypes import windll
hwnd = win32gui.FindWindow(None, 'Steam')
hdc = win32gui.GetDC(hwnd)
hdcMem = win32gui.CreateCompatibleDC(hdc)
hbitmap = win32ui.CreateBitmap()
hbitmap = win32gui.CreateCompatibleBitmap(hdcMem, 500, 500)
win32gui.SelectObject(hdcMem, hbitmap)
windll.user32.PrintWindow(hwnd, hdcMem, 0)
Run Code Online (Sandbox Code Playgroud)
这样对吗?怎么保存?
提前致谢.
我有一个用 C++ 编写的旧版 Win32 应用程序,它在系统上持续运行以监控系统健康相关参数。最近,我开始面临应用程序在 Windows 10 上每 2-3 天暂停并变得无响应的问题。经过一番研究,我了解到最近的 Windows 10 版本中引入的一项新功能,该功能会主动查找未被主动使用的进程并挂起这些进程以节省 CPU 和 RAM 等系统资源。虽然我遇到了几篇文章(参考链接之一是这个) 在该状态下,Windows 10 有大约 5-10 秒的等待时间,之后如果用户不主动使用它,它会将进程移至挂起状态。现在,我的应用程序每 30 秒向远程服务器发送一条 UDP 消息,向服务器表明该应用程序正在机器上运行。以下是我的问题:
附加信息:我尝试使用资源监视器和进程资源管理器手动暂停/恢复应用程序,因为应用程序不会立即暂停以了解行为,但没有运气。我有一种感觉,他应该在应用程序本身中处理,因为当前没有处理应用程序变得无响应。
由于我被困在这里几天,因此非常感谢任何帮助。
提前致谢!
我不是专家,我试图在屏幕上显示一个矩形,该矩形从固定起点开始跟随鼠标移动,就像您在文字或绘画中选择某些内容时一样。我带着这个代码:
import win32gui
m=win32gui.GetCursorPos()
while True:
n=win32gui.GetCursorPos()
for i in range(n[0]-m[0]):
win32gui.SetPixel(dc, m[0]+i, m[1], 0)
win32gui.SetPixel(dc, m[0]+i, n[1], 0)
for i in range(n[1]-m[1]):
win32gui.SetPixel(dc, m[0], m[1]+i, 0)
win32gui.SetPixel(dc, n[0], m[1]+i, 0)
Run Code Online (Sandbox Code Playgroud)
如您所见,代码将绘制矩形,但之前的矩形将保留,直到屏幕更新。
我唯一的解决方案是在将它们设置为黑色之前获取我要绘制的像素值,然后每次都重新绘制它们,但这使我的代码非常慢。有没有一种简单的方法可以更快地更新屏幕来防止这种情况发生?
...
用解决方案编辑。
正如@Torxed 所建议的,使用 win32gui.InvalidateRect 解决了更新问题。但是,我发现仅设置需要设置的点的颜色比要求矩形便宜。第一个解决方案渲染得相当干净,而第二个解决方案仍然有点问题。最后,最适合我的代码是:
import win32gui
m=win32gui.GetCursorPos()
dc = win32gui.GetDC(0)
while True:
n=win32gui.GetCursorPos()
win32gui.InvalidateRect(hwnd, (m[0], m[1], GetSystemMetrics(0), GetSystemMetrics(1)), True)
back=[]
for i in range((n[0]-m[0])//4):
win32gui.SetPixel(dc, m[0]+4*i, m[1], 0)
win32gui.SetPixel(dc, m[0]+4*i, n[1], 0)
for i in range((n[1]-m[1])//4):
win32gui.SetPixel(dc, m[0], m[1]+4*i, 0)
win32gui.SetPixel(dc, n[0], m[1]+4*i, 0)
Run Code Online (Sandbox Code Playgroud)
为了避免闪烁,必须进行除法和乘法四,但在视觉上与使用 …
import Graphics.Win32
import System.Win32.DLL
import Control.Exception (bracket)
import Foreign
import System.Exit
main :: IO ()
main = do
mainInstance <- getModuleHandle Nothing
hwnd <- createWindow_ 200 200 wndProc mainInstance
createButton_ hwnd mainInstance
messagePump hwnd
wndProc :: HWND -> WindowMessage -> WPARAM -> LPARAM -> IO LRESULT
wndProc hwnd wmsg wParam lParam
| wmsg == wM_DESTROY = do
sendMessage hwnd wM_QUIT 1 0
return 0
| wmsg == wM_COMMAND && wParam == 1 = do
messageBox nullPtr "Yahoo!!" "Message box" 0 …Run Code Online (Sandbox Code Playgroud) 我只是在学习python,而我是相对论的新手。我创建了以下脚本,该脚本将获取当前活动的Windows标题并将其打印到窗口中。
import win32gui
windowTile = "";
while ( True ) :
newWindowTile = win32gui.GetWindowText (win32gui.GetForegroundWindow());
if( newWindowTile != windowTile ) :
windowTile = newWindowTile ;
print( windowTile );
Run Code Online (Sandbox Code Playgroud)
上面的代码段有效。我没有尝试获取活动窗口(Foreground Window)的应用程序名称
我的问题是:
编辑
例如:如果用户从计算器(calc.exe)切换到Google Chrome(chrome.exe),我想查看他们切换到的应用程序被调用了。标题的问题在于,并非所有的应用程序都以应用程序名称作为标题的前缀。例如,谷歌浏览器将页面标题作为窗口标题。我想知道用户切换到哪个应用程序。
calc.exe
chrome.exe
Run Code Online (Sandbox Code Playgroud) 运行以下代码块时,GetPixel 每次大约在第 10,000 次调用时开始抛出错误。如果我将代码放在 try- except 语句中,则初始失败后的所有调用都将失败。恢复的唯一方法是终止脚本并再次运行它。我尝试在通话之间短暂休息一下。我尝试在调用之间触发垃圾收集。我尝试过从 IDE 运行该脚本并将其作为独立进程运行。有任何想法吗?即使运行脚本并报告是否/何时失败也会有所帮助。
import gc
import os
import time
import win32api, win32con, win32gui
import sys
import win32com.client
terms = 0
def get_pixel_colour(i_x, i_y):
i_desktop_window_id = win32gui.GetDesktopWindow()
i_desktop_window_dc = win32gui.GetWindowDC(i_desktop_window_id)
long_colour = win32gui.GetPixel(i_desktop_window_dc, i_x, i_y)
i_colour = int(long_colour)
return (i_colour & 0xff), ((i_colour >> 8) & 0xff), ((i_colour >> 16) & 0xff)
for x in range (0, 1000000):
colour = get_pixel_colour(500, 500)
terms = terms + 1
print terms
Run Code Online (Sandbox Code Playgroud)
返回的错误是
error: (0, 'GetPixel', 'No error …Run Code Online (Sandbox Code Playgroud) 我使用win32gui将记事本窗口移动到屏幕的原点 (0, 0),宽度和高度等于 500。结果是窗口没有移动到真正的左边框,而是 ~10 px。向右。宽度和高度也不等于 500 像素。(~620 像素。相反)。
我正在使用以下代码来生成我的结果。
import win32gui
from PIL import ImageGrab
# Open notepad.exe manually.
hwnd = win32gui.FindWindow(None, "Untitled - Notepad")
win32gui.MoveWindow(hwnd, 0, 0, 500, 500, True)
bbox = win32gui.GetWindowRect(hwnd)
img = ImageGrab.grab(bbox)
Run Code Online (Sandbox Code Playgroud)