我希望通过BitBlt获得更多性能以捕获屏幕.当Aero保持启用状态时,仅捕获屏幕的400x400像素区域可将捕获时间从我的计算机上的平均50毫秒(完整1920x1200)减少到大约33毫秒(400x400).这是一个令人失望的低改善.
我唯一的选择是禁用Aero吗?我知道当Aero被禁用时,我可以在全屏幕上获得快速3ms的快速捕捉.
我正在尝试为Windows应用程序制作一个自动登山者.它效果很好,但速度非常慢!我目前正在使用方法"getPixel",每次调用时都会重新加载一个数组.
这是我目前的代码:
hdc = GetDC(HWND_DESKTOP);
bx = GetSystemMetrics(SM_CXSCREEN);
by = GetSystemMetrics(SM_CYSCREEN);
start_bx = (bx/2) - (MAX_WIDTH/2);
start_by = (by/2) - (MAX_HEIGHT/2);
end_bx = (bx/2) + (MAX_WIDTH/2);
end_by = (by/2) + (MAX_HEIGHT/2);
for(y=start_by; y<end_by; y+=10)
{
for(x=start_bx; x<end_bx; x+=10)
{
pixel = GetPixel(*hdc, x, y);
if(pixel==RGB(255, 0, 0))
{
SetCursorPos(x,y);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
Sleep(50);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Sleep(25);
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本上,它只扫描屏幕中的一系列像素,并在检测到红色按钮时启动鼠标事件.
我知道还有其他方法可以获得像素颜色,例如bitblt.但是我做了一些研究,我不明白我应该怎么做,以便扫描一个颜色数组.我需要能够快速扫描屏幕的东西才能抓住按钮.
请你帮助我好吗?
谢谢.
有谁知道如何使用HBITMAP变量来编写png或jpeg文件?
我首先考虑用GDI +做这个,但是它给我错误告诉我min/max还没有被定义(定义它们只会带来更多问题),然后我查看了libpng的C++绑定(png ++)并且无法得到示例编译.
谢谢,
米奇
我似乎无法通过搜索得到明确的答案.Win32 blitting操作硬件是否加速(GDI,而不是GDI +).我不知道这些功能如何与图形驱动程序连接.是否有任何函数调用来验证此功能,例如?GetCaps?对于特定的图形设备(win32图形设备),看看这些功能是否正在接收硬件加速?
我一直试图寻找一个如何创建一个类/函数的例子,该类/函数试图从指定坐标的屏幕读取文本.
一些简单的东西,可以使用bitblt捕获屏幕的指定部分并在其上运行tesseract.所有内容都在内存中完成,无需将图像文件创建到磁盘.
Tesseract似乎有非常糟糕的API并且需要所有东西的TIF图像,据我所知,它甚至不能接受位图内存图像而不需要对其代码进行大量深入研究.
任何帮助将不胜感激,一个实际的例子将是理想的.
关于如何提高BitBlt()
在 VMware 中运行时的可靠性有什么想法/解决方法吗?我有一个计时器来测量所花费的时间:
SmartTimer debugTimer = SmartTimer();
debugTimer.restart();
int ms1 = debugTimer.elapsedTimeMs();
POINT origin = { rect.left, rect.top };
int ms2 = debugTimer.elapsedTimeMs();
ClientToScreen(win_hwnd, &origin);
int ms3 = debugTimer.elapsedTimeMs();
BitBlt(hMemoryDC, 0, 0, (rect.right - rect.left) + 1, (rect.bottom - rect.top) + 1, hScreenDC, origin.x, origin.y, SRCCOPY); // SRCCOPY
int ms4 = debugTimer.elapsedTimeMs();
if (ms1 > 150 || ms2 > 150 || ms3 > 150 || ms4 > 150) {
logs(std::format("getPixelData took very long: {} {} {} {}", ms1, …
Run Code Online (Sandbox Code Playgroud) 在Qt4的特定位置将一个QImage复制到另一个QImage的推荐方法是什么?
在Qt4中删除了QImage :: bitblt.
QImage现在是否需要转换为PixMap并返回?
我编写了以下代码(C++ Win32)来捕获游戏窗口屏幕并从图像中获取像素颜色数组。函数 autoB() 可以完成这项工作。
然后我将结果数组绘制到我的窗口中,以直观地检查我得到了什么。
问题是这个程序在我启动计算机后只运行一次,在它第一次“缓存”从游戏中截取的第一个屏幕截图之后,我总是得到相同的像素数组。即使我关闭并重新启动程序,我也会得到相同的屏幕截图。
游戏没有使用 DirectX 在屏幕上绘图,我总是可以使用 Alt+PrtSc 截取屏幕截图。
任何帮助理解为什么会以这种方式发生的帮助表示赞赏。
int getPixels(HDC *eClientHdcMem, HBITMAP *eClientBmp, unsigned char **lp) {
BITMAP bmpScreen;
BITMAPINFOHEADER bi;
GetObject(*eClientBmp, sizeof(BITMAP), &bmpScreen);
LONG bW = bmpScreen.bmWidth, bH = bmpScreen.bmHeight;
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bW;
bi.biHeight = -bH;
bi.biPlanes = 1;
bi.biBitCount = 32;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
DWORD dw = ((bW * bi.biBitCount + 31) / 32) * 4 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一些代码来检测游戏的wallhack.基本上,存在一些创建窗口空气透明窗口的黑客攻击,并且它们将黑客攻击到该外部窗口,因此无法通过截取游戏本身的屏幕截图来检测它.
我现在的方法是 - 1.截取游戏窗口的截图.2.为相同的坐标拍摄Windows桌面的屏幕截图.3.执行图像分析以比较屏幕截图1和屏幕截图2以查看是否存在差异.
我的问题是屏幕截图1和屏幕截图2不是同时执行的,因此可以在两个屏幕截图之间绘制新的游戏帧,从而在比较图像时导致误报.
我想知道是否有办法协调屏幕截图,以便它们完全同时发生?或以某种方式停止屏幕绘制任何新帧,直到我的截图完成?
这是我用于截取屏幕截图的代码.请注意,我甚至尝试通过排队两个工作项来并行拍摄2个屏幕截图.但是,即使这样也不会导致屏幕截图在同一时间发生.所以我想知道是否有某种方法可以阻止任何进一步的更新屏幕从显卡到屏幕截图结束?或者我能做到的任何其他方式?
public void DoBitBlt(IntPtr dest, int width, int height, IntPtr src)
{
GDI32.BitBlt(dest, 0, 0, width, height, src, 0, 0, GDI32.SRCCOPY);
}
public struct Windows
{
public Bitmap window;
public Bitmap desktop;
}
public Windows CaptureWindows(IntPtr window, IntPtr desktop, User32.RECT coords)
{
Windows rslt = new Windows();
// get te hDC of the target window
IntPtr hdcSrcWindow = User32.GetWindowDC(window);
IntPtr hdcSrcDesktop = User32.GetWindowDC(desktop);
// get the size
int width = coords.right - coords.left;
int …
Run Code Online (Sandbox Code Playgroud) 我正在使用BitBlt
winapi 函数截取给定窗口的屏幕截图,即使该窗口部分重叠。
我已经一切正常,除了在 Windows 10 上,对于某些窗口(如 Edge 浏览器),屏幕截图完全是黑色的。
许多其他问题都同意将此问题归因于在这些窗口上使用硬件加速图形上下文。
显然 GDI 库与那种图形上下文不兼容,因此必须使用不同的库。
我的问题特别是关于如何检测窗口是否使用与 GDI 库不兼容的图形上下文。
如果我能够检测到这一点,那么我可以选择使用哪个库来正确捕获屏幕截图(GDI、ActiveX 或其他)。
否则,我可以检测到的唯一方法是逐像素扫描屏幕截图以检查它是否完全黑色。然后使用不同的捕获方法,直到我在屏幕截图上获得一些内容。
但这听起来像是一个糟糕的解决方案。