小编nic*_*Yes的帖子

辅助功能服务:获取可以立即与之交互的视图(与“语音访问”相同)?

我们的目标是获得可与之交互的观点立刻(可以单击现在有什么东西会发生)。如果该视图通常可见且可单击,但已被另一个视图/菜单/侧面板悬停,则应将其省略。

语音访问可以做到这一点。它似乎使用了Accessibility API。

完美的例子是Google地图的底部菜单。展开后,下方的“沿路线搜索”按钮仍然可见,但应用突出显示。


那我们有什么呢?

  • 有一个AccessibilityEvent流。最有用的是 AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED,因此可以在发生事情时通知我们。
  • 使用getSource(),我们可以获取触发事件的AccessibilityNodeInfo的实例。或者我们可以使用AccessibilityService.getRootInActiveWindow()获得窗口的根。有了它,我们就可以遍历应用程序内的整个层次结构。
  • AccessibilityNodeInfo不提供有关视图的z顺序的任何信息,因此无法了解上方和下方的内容。
  • 底部菜单在同一窗口中(不是模式窗口)。
  • 如果在展开底部菜单时尝试单击“沿路线搜索”按钮,则底部菜单会折叠。因此,您实际上无法单击它,它在菜单下面。
  • 我已经通过的所有参数看上去AccessibilityNodeInfo一样isVisibleToUser()isClickable()isContextClickable()isSelected()isFocusable()isFocused()isAccessibilityFocused()和按钮具有相同的参数时,底部菜单被折叠/展开。用户可见,可聚焦和可点击。

  • 我研究了隐藏的API,没有发现任何有用的东西。

我想念的是什么?


在此处输入图片说明

android accessibility accessibility-api accessibilityservice android-accessibility

6
推荐指数
1
解决办法
128
查看次数

在禁用DWM的窗口模式下Direct3D 10 vsync问题

我在禁用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像素.因此,在创建带有标题栏的窗口时,图像的顶部有时可能根本看不到图像撕裂.

directx dwm vsync direct3d10 directx-10

5
推荐指数
0
解决办法
1978
查看次数

IWebBrowser2 Ctrl + C 等快捷键支持

看来我没有什么小问题。

我将自己的窗口挂接到 IE 主窗口。我的窗口是从 WTL 的 CWindowImpl 派生出来的,并承载了 IWebBrowers2 控件,它显示了一些内容。

IWebBrowser2 显示带有<input type='text'/>编辑框的html ,我需要支持所有键,这是编辑和操作文本所必需的(Ctrl + C、Ctrl + V、Ctrl + X 等... + Esc、删除、向上和向下箭头)。

另外我需要禁止一些快捷方式,例如 Ctrl + P、Ctrl + S,因为它们调用特定于我不需要的网页的对话框。


似乎是常见问题,我需要为 IWebBrowser2 对象调用 TranslateAccelerator。

网上有一些类似的问题——Tab键在IWebbrowser2中不起作用

解决方案——热键不起作用!!

IWebBrowser2 控件中的 Tab 键支持

这是一个非常有趣的线程,我只需要 -在托管的 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)

hook winapi internet-explorer wtl iwebbrowser2

3
推荐指数
1
解决办法
2113
查看次数