我们的目标是获得可与之交互的观点立刻(可以单击现在有什么东西会发生)。如果该视图通常可见且可单击,但已被另一个视图/菜单/侧面板悬停,则应将其省略。
语音访问可以做到这一点。它似乎使用了Accessibility API。
完美的例子是Google地图的底部菜单。展开后,下方的“沿路线搜索”按钮仍然可见,但应用未突出显示。
我已经通过的所有参数看上去AccessibilityNodeInfo一样isVisibleToUser(),isClickable(),isContextClickable(),isSelected(),isFocusable(),isFocused(),isAccessibilityFocused()和按钮具有相同的参数时,底部菜单被折叠/展开。用户可见,可聚焦和可点击。
我研究了隐藏的API,没有发现任何有用的东西。
我想念的是什么?
android accessibility accessibility-api accessibilityservice android-accessibility
我在禁用DWM的窗口模式下在Direct3D 10上遇到vsync问题.
我们有一个应用程序,它呈现并呈现一些输出.它必须在窗口模式下工作,它必须至少产生稳定的60 fps.一个版本的应用程序使用Direct3D 9和另一个Direct3D 10.当我们在窗口模式下工作时,有时我们有fps减少(它不是"稳定"减少.大多数时候我们产生稳定的60 fps,有时它会突然减少几秒钟,然后回到60帧/秒).在两个版本的应用程序中,fps减少约为10-20 fps.这是不可接受的.
在Windows Vista和Windows 7中,有一种新的图形系统,称为"桌面组合",它改变了应用程序在屏幕上显示像素的方式.桌面组合由桌面窗口管理器(DWM)执行.您知道,当启用DWM时,应用程序将绘制到视频内存中的屏幕外表面,而不是由DWM呈现并在一段时间内显示在显示屏上.所以,我们注意到,当任务管理器中的dwm.exe没有做任何事情(处理时间约为0%)时,我们有fps减少,当dwm.exe需要1-3%的处理时间时,有稳定的60 fps,所有都是好.
我们无法影响它.因此,我们必须关闭DWM才能获得高稳定的fps.当我们关闭它时,一切都好.两个版本的应用程序都有稳定的60 fps.但是DWM在窗口模式下执行vsync,所以当我们关闭它时,我们必须自己做vsync.
但是当我们关闭DWM时,在窗口模式下Direct3D 10中的vsync存在问题.在显示器顶部有图像撕裂.Direc3D 9运行良好.
因此,我们有一个60 Hz刷新率的显示器.
在创建交换链时,我们设置了这样的参数:
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
Run Code Online (Sandbox Code Playgroud)
在演示时我们设置了一个标志来打开vsync:
m_pSwapChain->Present( 1, 0 );
Run Code Online (Sandbox Code Playgroud)
并有下一个vsync问题.有垂直线,从左到右快速移动.并且在显示器的顶部有图像撕裂.
http://bit.ly/POQoFq
起初我们认为,我们做错了什么.所以我用旋转立方体安装了Microsoft的示例"Tutorial 07:Texture Mapping and Constant Buffers".制作更大的立方体,将其放置得更高,使其旋转得更快并得到同样的问题(见图片).
http://bit.ly/SevNqw
http://bit.ly/RSoEhc
http://bit.ly/UjaNPu
所以,在全屏模式下的Direct3D 10上一切都还可以.Vsync工作得很好.在Direct3D 9上也可以,在禁用或启用DWM的情况下,vsync工作正常.在禁用DWM的窗口模式下的Direct3D 10上存在问题.
它在不同的计算机,不同的视频卡(Nvidia 8600 GT,Nvidia 9500 GT,ATI Radeon HD 5870 Eyefinity 6)和不同版本的驱动程序上进行了测试.问题稳定转载.我们正在使用Windows 7.
那么,为什么会出现这样的问题呢?如何解决它以及接下来该做什么?
UPD1.如果上面的图像不可用,则会有一些镜像.
https://dl.dropbox.com/u/20468014/DSC_2287.JPG
https://dl.dropbox.com/u/20468014/DSC_2308.JPG
https://dl.dropbox.com/u/20468014/DSC_2313. JPG
https://dl.dropbox.com/u/20468014/DSC_2319.JPG
UDP2.我还要注意,我正在使用标志WS_POPUP创建窗口以隐藏标题栏(必须隐藏它).图像撕裂出现在不同的地方.它始终位于屏幕的顶部,但它可以是20像素,并且可以是50像素.因此,在创建带有标题栏的窗口时,图像的顶部有时可能根本看不到图像撕裂.
看来我没有什么小问题。
我将自己的窗口挂接到 IE 主窗口。我的窗口是从 WTL 的 CWindowImpl 派生出来的,并承载了 IWebBrowers2 控件,它显示了一些内容。
IWebBrowser2 显示带有<input type='text'/>编辑框的html ,我需要支持所有键,这是编辑和操作文本所必需的(Ctrl + C、Ctrl + V、Ctrl + X 等... + Esc、删除、向上和向下箭头)。
另外我需要禁止一些快捷方式,例如 Ctrl + P、Ctrl + S,因为它们调用特定于我不需要的网页的对话框。
似乎是常见问题,我需要为 IWebBrowser2 对象调用 TranslateAccelerator。
网上有一些类似的问题——Tab键在IWebbrowser2中不起作用
解决方案——热键不起作用!!
这是一个非常有趣的线程,我只需要 -在托管的 Web 浏览器控件中处理 Control-C
所以,首先我需要为我的 IWebBrowser2 对象调用 TranslateAccelerator。但我必须先从键盘获取消息。
那么,让我们看看它的外观。

我的钩子窗口没有收到任何键盘输入消息。一个类为“Internet Explorer_Server”的窗口接收所有这些(实际上,它是 IWebBrowser2 中 IE 的一个 hwnd)。
所以我需要钩住这个 hwnd 的 window proc。
m_ieOldProc = (PROC)::SetWindowLongPtr ( hIEWnd, GWLP_WNDPROC, (LONG_PTR)_IEWndProc );
Run Code Online (Sandbox Code Playgroud)
在 hooked wnd proc 中,我执行以下操作:
// …Run Code Online (Sandbox Code Playgroud) android ×1
direct3d10 ×1
directx ×1
directx-10 ×1
dwm ×1
hook ×1
iwebbrowser2 ×1
vsync ×1
winapi ×1
wtl ×1