如何解决Qt:快速屏幕采样导致鼠标光标闪烁
您好,我使用此代码快速(约60次/秒)对屏幕进行采样并找到其平均颜色:
samplerWorker::samplerWorker(int newId)
{
this->id = newId;
this->screenWidth = GetSystemMetrics(SM_CXSCREEN);
this->screenHeight = GetSystemMetrics(SM_CYSCREEN);
this->hDesktopWnd = GetDesktopWindow();
this->hDesktopDC = GetDC(this->hDesktopWnd);
this->hCaptureDC = CreateCompatibleDC(this->hDesktopDC);
}
void samplerWorker::sampleAvgColor(int workerId)
{
if(workerId != this->id)
{
return;
}
HBITMAP hCaptureBitmap = CreateCompatibleBitmap(this->hDesktopDC,this->screenWidth,this->screenHeight);
SelectObject(hCaptureDC,hCaptureBitmap);
BitBlt(this->hCaptureDC,this->screenHeight,this->hDesktopDC,SRCCOPY|CAPTUREBLT);
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = this->screenWidth;
bmi.bmiHeader.biHeight = this->screenHeight;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
int size = this->screenWidth * this->screenHeight * 4;
unsigned char *pPixels = new unsigned char[size];
GetDIBits(this->hCaptureDC,hCaptureBitmap,pPixels,&bmi,DIB_RGB_COLORS);
unsigned int avgR = 0;
unsigned int avgG = 0;
unsigned int avgB = 0;
size = size /4;
for (int i = 0; i < size; i++) {
avgB = avgB + pPixels[4*i + 0];
avgG = avgG + pPixels[4*i + 1];
avgR = avgR + pPixels[4*i + 2];
}
avgR = avgR / (size);
avgG = avgG / (size);
avgB = avgB / (size);
emit returnAvgColor(avgR,avgG,avgB);
delete[] pPixels;
DeleteObject(hCaptureBitmap);
}
samplerWorker是一个在几个单独的线程中工作的对象,每个samplerWorker都在一个单独的线程中,它们被一个接一个地调用,因此samplerWorker的第一个屏幕截图是id == 0,然后id == 1,依此类推,直到所有这些都被调用,然后它返回ID == 0的采样器worker。但是由于某些原因,当我以足够快的速度(大于10-15 fps)对屏幕截图时,我的光标开始闪烁。可能导致此问题的原因是什么?
解决方法
引用:Raymond Chen Discusses the Case of the Disappearing Cursor
这些半透明窗口通常称为分层窗口,通常不是 从屏幕读取像素时,BitBlt函数包含的内容。 为了获得它们,您必须传递CAPTUREBLT标志。
鼠标光标只是另一个合成对象,因此 将被CAPTUREBLT标志捕获。为了防止这种情况 发生在屏幕捕获期间,合成引擎必须隐藏 光标,执行CAPTUREBLT,然后重新显示光标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。