【问题标题】:Make a window a part of the desktop使窗口成为桌面的一部分
【发布时间】:2015-01-05 16:06:58
【问题描述】:

我想创建一个窗口

CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_LAYERED, wc.lpszClassName, 0, WS_POPUP | WS_VISIBLE | WS_SYSMENU, ...);

桌面的一部分(我知道这可能是不可能的,但我想尽可能接近这种感觉)。

因此,我需要当 WIN+D 被点击(或者当点击屏幕右下角Show desktop 按钮时),窗口 不应隐藏

WIN+D显示桌面时如何防止窗口隐藏?

注意:我最初认为可以通过阻止窗口最小化来实现 (https://stackoverflow.com/questions/27781352/prevent-window-to-be-minimized?noredirect=1#comment43975051_27781352) 但正如一些用户指出的那样,似乎 这是另一个问题。

【问题讨论】:

  • 这位来自法国的 john 似乎不喜欢接到陌生人的电话。也许您应该从屏幕截图中删除他的电话号码。
  • 这个数字就是06+12345678。想要打一些恶作剧电话的人不需要这个屏幕截图来打电话给拥有 0611111111 或 0606060606 或任何其他有趣的号码的人@IInspectable
  • 这就解释了为什么他固执地坚持他的名字不是约翰。
  • 不,你没有……是吗? @IInspectable

标签: winapi user-interface desktop


【解决方案1】:

可以通过以下方式使窗口成为桌面的一部分:

HWND hwndOwner = GetWindow(GetWindow(GetTopWindow(0), GW_HWNDLAST), GW_CHILD);
SetWindowLong(hwndMain, GWL_HWNDPARENT, (LONG) hwndOwner);

还可以尝试另一个测试:http://files.rsdn.ru/42164/quasi_owner.zip(exe + 源,在 Win7-x86 上测试)。


第一个版本(不是真的工作):

删除WS_MINIMIZEBOX 并添加WS_EX_TOPMOST 就足够了

【讨论】:

  • 不会 WS_EX_TOPMOST 把它放在其他窗口的前面,而不仅仅是桌面?
  • 我尝试了@kero,确实,使用WS_EX_TOPMOST 使窗口位于所有窗口的前面,而不仅仅是桌面,不幸的是。
  • @Basj,然后尝试 SetWindowLong(your_hwnd,GWL_HWNDPARENT,quasiowner_hwnd),其中 quasiowner = GetWindow(GetWindow(GetWindowTop(0),GW_HWNDLAST),GW_CHILD)) = SHELLDLL_DefView = Progman 的子级。
  • 这已经很糟糕了。如果您绝对必须重新设置窗口,请正确操作:SetParent。不要忽视现实,比如 64 位系统。 SetWindowLongNote 已经存在了大约十年。无论如何,除非您控制这两个过程,否则您正在尝试的内容无法可靠地工作。鉴于此答案的质量,我希望您不在 Explorer 团队中。
  • @IInspectable,很明显,你不了解SetParent的作用,我可以推荐我的老教程demofiles.rsdn.ru/42164/ParentOwner.zip。但是,从我这里的另一个话题(stackoverflow.com/questions/25641251/…)来看,即使是清晰的演示也可能对您没有帮助,所以我同情...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多