请教如何判断屏幕发生变化

如题,希望是毫秒级的,请私信,解决问题另有感谢。

首先明确你的需求是毫秒级,所以截屏再隔几秒再截屏比较差异的方式进行判断肯定是不符合你需求的。

所以检测屏幕输出内存是否变化的方式肯定达不到你要求,按当今屏幕1920*1080来看,其缓存是1920 * 1080 * 32 / 8 约8M。

在毫秒级下进行两次截取和对比,我认为是不可能完成的,就算能,我认为其CPU计算也夸张的离谱。

那么只能考虑hook api 或者 只检测局部区域 这两种方法,理想的情况是知道所有触发修改屏幕的情况,再一个一个hook。

我相信我的答案会快得多。

 

反向思路借鉴:https://blog.csdn.net/dymx101/article/details/5571744

====

刚看了楼主的博客,按键精灵相关的话题居多,那就不是涉及底层开发,那就用简单的方式,就判断局部的屏幕是否发生变化就行了,这个快的。100*100就差不多毫秒。还有就是python lua本来就慢,想要更快可以用c++或者c开发程序。

 

===

记得给好评

===

现在又想到了一种方法,修改屏幕电路,物理方式检测,只要屏幕被修改了就返回一个信号量,这样也可以达到毫秒级,不过只是猜想,本人不是硬件工程师,得问问专业的老师了

浏览器的css还是浏览器的js??还是图形软件

麻烦各位私信联系,谢谢

判断屏幕发生变化并不困难,问题是如何表述这个事件。我简单写了几行代码,屏幕内容如有变化可保存为图片,响应速度10毫秒。

有三个方法可以跳过window server来直接绘制屏幕(这里称为Direct drawing),这通常用在游戏程序中使得屏幕绘制更加快速。
其中一个直接访问的方法就是直接访问屏幕内存,并通过编辑内存来绘制屏幕。
这里可以使用UserSvr::ScreenInfo()这个API来获取屏幕地址,结果放在TScreenInfoV01包中,下面的代码片段可以获得内存地址,并绘制一个简单的矩形到屏幕上:

 TPckgBuf<TScreenInfoV01> infoPckg;
TScreenInfoV01& screenInfo = infoPckg();
UserSvr::ScreenInfo(infoPckg);
TUint16* screenMemory = (TUint16*) screenInfo.iScreenAddress + 16;

for (int j = 80; j < 140; j++)
{
for (int i = 0; i < 176; i++)
{
*(screenMemory + 2*(16 + i + j*176)) = i/8 + j;
}
}

当绘制完成后,屏幕将会被更新,变化后的内容直接反映在屏幕上,
我们可以通过向系统队列增加一个重绘事件来完成TRawEvent::ERedraw(通过UserSvr::AddEvent()),
它将立刻更新屏幕,下列代码演示了如何处理:

TRawEvent redraw;
redraw.Set(TRawEvent::ERedraw);
UserSvr::AddEvent(redraw);

但TRawEvent::ERedraw是由主机系统生成的,如模拟器环境的WM_PAINT事件。
S60第二版中,屏幕更新可以通过增加系统队列完成,但第三版中却无法立刻展现系统队列中重绘指令的效果。
屏幕只能通过手机屏幕关于超出数据区域的通知事件才能更新。 所以通过UserSvr::ScreenInfo()来修改显示内存的方法在S60第三版后是不建议使用的。
作为一个解决方案,可以通过使用老的绘制方法强制屏幕更新,
通过使用CFbsScreenDevice的Update()方法来指明超出数据区域,这个代码示例如下:

CFbsScreenDevice* iMyScreenDev = CFbsScreenDevice::NewL(0 ,EColor64K); // the screennumber will be 0 if phone supports single screen where as the
// displaymode can be as per your choice
RRegion iMyregion;
iMyregion.AddRect(TRect(0,0,240,320)); // the out of date rect region.
iMyScreenDev->Update(iMyregion);
iMyregion.Close();