标签: win32gui

双缓冲?Win32 c ++

我正在尝试实现双缓冲但它似乎不起作用,即图形仍然闪烁.

每次鼠标移动时都会调用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)

c++ gdi win32gui

7
推荐指数
1
解决办法
7410
查看次数

python3 ctype CreateWindowEx简单示例

我已经google了一段时间,但找不到用于创建和显示窗口的python3 ctypes和Win32 API的简单示例.请指出我的好链接或显示代码.

提前致谢!

winapi ctypes pywin32 win32gui python-3.x

6
推荐指数
3
解决办法
2796
查看次数

如何使用python获取窗口标题并每隔100ms扫描一次?

使用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毫秒并在更改时返回新标题?

python win32gui

6
推荐指数
1
解决办法
1万
查看次数

Python非活动窗口PrintWindow + win32gui的截图

经过几个小时的谷歌搜索,我设法"写"这个:

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)

这样对吗?怎么保存?

提前致谢.

python screenshot win32gui

6
推荐指数
1
解决办法
9899
查看次数

处理/防止非 UWP Win32 应用程序在 Windows 10 中挂起

我有一个用 C++ 编写的旧版 Win32 应用程序,它在系统上持续运行以监控系统健康相关参数。最近,我开始面临应用程序在 Windows 10 上每 2-3 天暂停并变得无响应的问题。经过一番研究,我了解到最近的 Windows 10 版本中引入的一项新功能,该功能会主动查找未被主动使用的进程并挂起这些进程以节省 CPU 和 RAM 等系统资源。虽然我遇到了几篇文章(参考链接之一是这个) 在该状态下,Windows 10 有大约 5-10 秒的等待时间,之后如果用户不主动使用它,它会将进程移至挂起状态。现在,我的应用程序每 30 秒向远程服务器发送一条 UDP 消息,向服务器表明该应用程序正在机器上运行。以下是我的问题:

  1. 有没有办法防止应用程序被挂起,或者有办法将此超时增加到一个相对较大的值,以便应用程序保持活动状态?
  2. 还有其他非基于 UI 的应用程序也在我的系统上运行,它们相对不太活跃,但它们永远不会被挂起,这是否仅适用于基于 UI 的应用程序?
  3. 虽然有一些像这样的引用在您的应用程序中添加特殊处理以捕获来自 Windows 的挂起消息并在您的应用程序中保存必要的状态,但所有这些引用都是基于 C# 的。有人可以指出我对 C++ 的类似参考吗?
  4. 有什么方法可以跟踪 Windows 以某些事件日志或 Windows 日志的形式暂停应用程序的时间和原因?

附加信息:我尝试使用资源监视器和进程资源管理器手动暂停/恢复应用程序,因为应用程序不会立即暂停以了解行为,但没有运气。我有一种感觉,他应该在应用程序本身中处理,因为当前没有处理应用程序变得无响应。

由于我被困在这里几天,因此非常感谢任何帮助。

提前致谢!

c++ windows win32gui windows-10-desktop

6
推荐指数
0
解决办法
1274
查看次数

如何使用Python在屏幕上绘制一个空矩形

我不是专家,我试图在屏幕上显示一个矩形,该矩形从固定起点开始跟随鼠标移动,就像您在文字或绘画中选择某些内容时一样。我带着这个代码:

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)

为了避免闪烁,必须进行除法和乘法四,但在视觉上与使用 …

python drawing updating pywin32 win32gui

6
推荐指数
1
解决办法
2万
查看次数

消息框错误:外部导入不安全

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)

haskell win32gui

5
推荐指数
1
解决办法
601
查看次数

win32gui获取当前活动的应用程序名称

我只是在学习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)的应用程序名称

我的问题是:

  • 如何在python中获取前台活动Windows应用程序名称?

编辑

例如:如果用户从计算器(calc.exe)切换到Google Chrome(chrome.exe),我想查看他们切换到的应用程序被调用了。标题的问题在于,并非所有的应用程序都以应用程序名称作为标题的前缀。例如,谷歌浏览器将页面标题作为窗口标题。我想知道用户切换到哪个应用程序。

calc.exe
chrome.exe
Run Code Online (Sandbox Code Playgroud)

python windows win32gui

5
推荐指数
2
解决办法
6082
查看次数

pywin32 win32gui GetPixel 在接近第 10,000 次调用时可预见地失败

运行以下代码块时,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)

python pywin win32gui

5
推荐指数
1
解决办法
2988
查看次数

win32gui MoveWindow() 未与屏幕左边缘对齐

我使用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)

这里是窗口在屏幕上的整体位置的截图:
在此处输入图片说明

这里有一张图片img在此处输入图片说明

python pywin32 win32gui python-imaging-library

5
推荐指数
1
解决办法
4888
查看次数