- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在我的一个程序中,我需要测试用户当前是否聚焦于桌面/shell 窗口。目前我正在使用 user32.dll 中的 GetShellWindow() 并将结果与 GetForegroundWindow() 进行比较。
这种方法在有人更改桌面墙纸之前一直有效,但是一旦更改了墙纸,GetShellWindow() 的句柄就不再与 GetForegroundWindow() 的句柄匹配,我不太明白为什么会这样。 (操作系统:Windows 7 32 位)
是否有更好的方法来检查桌面是否聚焦?如果用户更改壁纸,最好是不会损坏的?
编辑: 我设计了一个解决方法:我正在测试句柄是否有类“SHELLDLL_DefView”的子项。如果有,则桌面处于焦点位置。虽然它在我的电脑上工作,但这并不意味着它会一直工作......
最佳答案
事情发生了一点变化,因为在 Windows 7 中可以使用幻灯片作为墙纸。您对 WorkerW 是正确的,但这仅适用于设置为幻灯片效果的墙纸。
当设置壁纸模式为幻灯片时,您必须搜索类WorkerW
的窗口并检查 child 是否有SHELLDLL_DefView
。如果没有幻灯片,您可以使用旧的 GetShellWindow()
。
几个月前我遇到了同样的问题,我写了一个函数来获取正确的窗口。不幸的是我找不到它。但以下应该有效。仅缺少 Win32 导入:
public enum DesktopWindow
{
ProgMan,
SHELLDLL_DefViewParent,
SHELLDLL_DefView,
SysListView32
}
public static IntPtr GetDesktopWindow(DesktopWindow desktopWindow)
{
IntPtr _ProgMan = GetShellWindow();
IntPtr _SHELLDLL_DefViewParent = _ProgMan;
IntPtr _SHELLDLL_DefView = FindWindowEx(_ProgMan, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr _SysListView32 = FindWindowEx(_SHELLDLL_DefView, IntPtr.Zero, "SysListView32", "FolderView");
if (_SHELLDLL_DefView == IntPtr.Zero)
{
EnumWindows((hwnd, lParam) =>
{
if (GetClassName(hwnd) == "WorkerW")
{
IntPtr child = FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null);
if (child != IntPtr.Zero)
{
_SHELLDLL_DefViewParent = hwnd;
_SHELLDLL_DefView = child;
_SysListView32 = FindWindowEx(child, IntPtr.Zero, "SysListView32", "FolderView"); ;
return false;
}
}
return true;
}, IntPtr.Zero);
}
switch (desktopWindow)
{
case DesktopWindow.ProgMan:
return _ProgMan;
case DesktopWindow.SHELLDLL_DefViewParent:
return _SHELLDLL_DefViewParent;
case DesktopWindow.SHELLDLL_DefView:
return _SHELLDLL_DefView;
case DesktopWindow.SysListView32:
return _SysListView32;
default:
return IntPtr.Zero;
}
}
在您的情况下,您将调用 GetDesktopWindow(DesktopWindow.SHELLDLL_DefViewParent);
来获取顶级窗口以检查它是否是前景窗口。
关于c# - 获取桌面/外壳窗口的句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364758/
我设置了 Helm 柄和 Helm 柄。我有tiller-deploy。昨天,我可以定期运行了。但今天我收到此错误消息 Error: could not find a ready tiller pod
我以前已将分er安装到特定的 namespace 中。 我设置了一个环境变量来设置'tiller'命名空间-但我不记得该环境变量的名称-而且似乎无法通过网络搜索找到它。 这是什么 key ? 最佳答案
当我在 View 模型中使用如下界面时 class MainViewModel @ViewModelInject constructor( private val trafficImagesR
我正在尝试找到如何在某个 fragment 相关场景中定义 Hilt 的解决方案。我有以下设置: Activity 父 fragment 1 子 fragment 1 子 fragment 2 ...
Hilt 指出如果没有@Provides 注解就不能提供这个接口(interface): interface PlannedListRepository { fun getAllLists()
我的问题非常简单明了:两个注释/示例之间有什么区别: 例子一 @Singleton class MySingletonClass() {} @Module @InstallIn(FragmentCom
我是一名优秀的程序员,十分优秀!