4

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

返回的错误是

error: (0, 'GetPixel', 'No error message is available')
4

1 回答 1

3

我怀疑当 i_desktop_windw_dc 对象被垃圾收集时,资源没有被释放。也许需要一个 releaseDC 调用,但是在安装 pywin32 后在我的系统上进行简短搜索后,我找不到文档或源代码。我确实在 win32gui 中看到了 ReleaseDC 函数,我只能猜测您应该使用它来释放您通过 win32gui.GetWindowDC 获得的设备上下文。

这可能是一种解决方法:

import gc
import os
import time
import win32api, win32con, win32gui
import sys
import win32com.client

terms = 0
class DesktopWindow(object):
    def __init__(self, *args, **kwargs):
        self.window_id = win32gui.GetDesktopWindow()
        self.window_dc = win32gui.GetWindowDC(self.window_id)
        pass
    def get_pixel_color(self, i_x, i_y):
        long_colour = win32gui.GetPixel(self.window_dc, i_x, i_y)
        i_colour = int(long_colour)
        return (i_colour & 0xff, (i_colour >> 8) & 0xff,
                (i_colour >> 16) & 0xff)

dtop = DesktopWindow()

for x in range (0, 1000000):
    colour = dtop.get_pixel_color(500, 500)
    terms = terms + 1
    if terms % 100 == 0:
        print terms

当我输入时,这很高兴在这里通过了 200,000 次 get_pixel_color 操作。

另外,win32gui.ReleaseDC(i_desktop_window_id, i_desktop_window_dc)在你的独立函数结束时尝试,看看是否有帮助。(这是您在 WinAPI 编码中应该做的事情……完成后立即释放 DC。)

注意:以上已修复...您在调用 ReleaseDC时需要窗口句柄 (hWnd=window id)和设备上下文句柄 (hDC)。请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/dd162920%28v=vs.85%29.aspx

于 2013-10-27T22:32:45.403 回答