Пожалуйста, используйте win32gui.FindWindow(None, name)
.
Минимальный код:
import win32gui
import win32ui
import win32con
name = "test.txt - Notepad"
hwnd = win32gui.FindWindow(None, name)
left, top, right, bot = win32gui.GetWindowRect(hwnd)
w = right - left
h = bot - top
print(w,h)
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, w, h)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0,0),(w, h) , dcObj, (0,0), win32con.SRCCOPY)
dataBitMap.SaveBitmapFile(cDC, "1.bmp")
# Free Resources
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
Я предполагаю, что winapi
с одним и тем же именем возвращает разные типы в разных библиотеках.
Например win32gui.FindWindow
и win32ui.FindWindow
При создании снимка экрана определенного приложения c вы столкнетесь с рядом других проблем, таких как невозможность сделать снимок экрана Firefox правильно .
Существует еще один способ решения этой проблемы, см .: Снимки экрана с win32api python возвращает черное изображение
В качестве дополнения:
Я протестировал EnumWindows
и FindWindow
в C ++, они будут возвращать одни и те же данные, и при использовании GetWindowDC
.
не будет ошибок. Вот код C ++:
#include <Windows.h>
#include <string>
#include <iostream>
static BOOL CALLBACK enumWindowCallback(HWND hWnd, LPARAM m) {
RECT rc;
int length = GetWindowTextLength(hWnd);
char* buffer = new char[length + 1];
GetWindowText(hWnd, buffer, length + 1);
if (!strcmp(buffer, "Photos"))
{
HDC hdc = GetWindowDC(hWnd);
GetWindowRect(hWnd, &rc);
std::cout <<"EnumWindows: "<< rc.right-rc.left <<" "<< rc.bottom-rc.top<<std::endl;
std::cout <<"EnumWindows: "<< hWnd << std::endl;
}
return TRUE;
}
int main()
{
RECT rc;
HWND window = FindWindow(NULL, "Photos");
GetWindowRect(window, &rc);
std::cout <<"FindWindow: "<< rc.right - rc.left <<" "<< rc.bottom - rc.top << std::endl;
std::cout <<"FindWindow: "<< window << std::endl;
HDC hdc = GetWindowDC(window);
EnumWindows(enumWindowCallback, NULL);
return 0;
}
Отладка:
FindWindow: 649 640
FindWindow: 00080A6A
EnumWindows: 649 640
EnumWindows: 00080A6A