Win 10:如何使窗口始终位于顶部但不交互(点击通过)?

Win 10:如何使窗口始终位于顶部但不交互(点击通过)?

我试图在屏幕上设置一个始终位于顶部但同时“重影”的小窗口(不确定这个术语),这意味着我无法与它交互或激活它,并且任何鼠标单击都会穿过它。

更具体地说,我希望 VLC 在视频游戏上方的一个小窗口中播放视频,但又不阻止我在屏幕的那个区域进行交互。

到目前为止,我一直在尝试 WinWarden(一个 AHK 脚本)并设法设置窗口的位置和大小,但我无法弄清楚如何使窗口不可交互(理论上 WinWarden 有能力做到这一点,但我还没有设法让它工作)。

关于如何做到这一点或从哪里开始,您有什么想法吗?

答案1

如果有人需要类似的东西,我设法通过在 WinWarden 脚本中添加几行代码来实现,这些代码来自邮政

答案2

WinKey++Alt使Space当前窗口总在最前面通过点击, 和透明的

  • 您可以设置自定义透明度值,例如Montage(128),但我发现这187似乎是在明暗背景上一个很好的折衷:
Montage(trans := 187){
  WinSet AlwaysOnTop, OFF, A            ; Tricky! A Style value cannot be negative.
  WinGet ExStyle, ExStyle, A            ; If it would be negative, it is not applied.
  WinSet ExStyle, -0x80020, A           ; Therefore, if the style value has not changed,
  WinGet Normal, ExStyle, A             ; then it never had a Style to begin with.

  if (ExStyle = Normal){
    WinSet AlwaysOnTop, On, A           ; Apply styles.
    WinSet ExStyle, +0x80020, A
    WinSet Transparent, % trans, A
  }
  return
}
  • 更好的注释和重构按位运算:
    #!Space:: Montage()
    
    Montage(trans := 187){
      WinExist("A")                         ; Last Found Window
      WinGet ExStyle, ExStyle               ; Store the Extended Styles in the variable ExStyle.
    
      if (ExStyle & 0x80028) == 0x80028 {   ; WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOPMOST
        WinSet AlwaysOnTop, Off             ; Uses SetWindowPos instead of SetWindowLong.
        WinSet ExStyle, -0x80028            ; Remove clickthough and transparency.
      } else {
        WinSet AlwaysOnTop, On              ; Although WS_EX_TOPMOST (0x8) is an ExStyle, it requires SetWindowPos.
        WinSet ExStyle, +0x80028            ; Add clickthough and transparency.
        WinSet Transparent, % trans         ; Set window transparency value.
      }
    }
    
  • 更快、改进的版本,修复竞争条件:
    Montage(trans := 187){
      WinExist("A")                         ; Last Found Window
      WinSet AlwaysOnTop, OFF               ; Tricky! A Style value cannot be negative.
      WinGet ExStyle, ExStyle               ; If it would be negative, it is not applied.
      WinSet ExStyle, -0x80020              ; Therefore, if the style value has not changed,
      WinGet Normal, ExStyle                ; then it never had a Style to begin with.
    
      if (ExStyle = Normal){
        WinSet AlwaysOnTop, On              ; Apply styles.
        WinSet ExStyle, +0x80020
        WinSet Transparent, % trans
      }
    }
    

答案3

我没有足够的声誉来发表评论;这是对对话的回应这里关于给定解决方案的可重复性。我还没有测试过 Edison Hua 的解决方案,但如果有人已经安装了 WinWarden,并且更愿意将解决方案与其集成,那么我就是这样做的。

简短答案

总结:当透明度启用(<100%)时,此差异将启用鼠标点击功能,当透明度设置为关闭时,将禁用鼠标点击功能(将此补丁应用到WinWarden.ahk;您必须运行.AHK 文件或之后重新编译.EXE):

1516a1517,1518
> {
>    WinSet, ExStyle, -0x20, ahk_id %actwinid%
1517a1520,1524
> }
> Else
> {
>    WinSet, ExStyle, +0x80020, ahk_id %actwinid%
> }

长答案

网站在原始评论中已关闭。好吧,链接是;实际网站是 现在jacksautohotkeyblog.workpress.com而不是jacks-autohotkey-blog.com,并且回答者提到的摘录很可能是这里(具体来说这里; (今日档案回溯)):

上次我引用了在旧 AutoHotkey 论坛中找到的一个脚本,该脚本用于使窗口始终位于顶部或透明。在同一个脚本中,您可以找到用于将任何窗口更改为鼠标单击透明并再次更改的热键。这些热键的以下修改版本包括一个用于打开鼠标单击透明度的热键和一个用于关闭透明度的热键:

^!x::       ; Make mouse-click transparent
  WinGet, currentWindow, ID, A
  WinSet, ExStyle, +0x80020, ahk_id %currentWindow%
Return
^!z::       ; Undo mouse-click transparent
  WinSet, ExStyle, -0x20, ahk_id %currentWindow%
Return

WinWarden 程序是一个巨大的 AHK 脚本,因此对 .AHK 文件的编辑不会反映在 .EXE 中,因为它是自编译的。我为个人使用所做的修改是针对代码的以下部分(现在可追溯到 2005 年):

SETTRANSPACT:
WinSet,Transparent,%atransparency%,ahk_id %actwinid%
If atransparency=255
   WinSet,Transparent,Off,ahk_id %actwinid%
Return

由以下子程序调用:

TRANSPARENCY:
Gosub,CHECKACTIVE
If activematch=N
{
   Gosub,GETWINDATA
   atransparency:=Round(((11-transpnum)*25.6)-1)
   Gosub,SETTRANSPACT
}
Gosub,REACTIVATE
Return

本质上,透明菜单的作用类似于跳转表:

TRANSPMENU:
transpnum:=A_ThisMenuItemPos
Gosub,TRANSPARENCY
Return

A_ThisMenuItemPos是菜单的位置索引(是的,哈哈)。这意味着计算Round(((11-transpnum)*25.6)-1)实际上是使用一些巧妙的数学方法将索引(Off=1、10%=2、20%=3、... 90%=10)投影到 25 到 255 之间的值。

查看之前的代码片段:

If atransparency=255
   WinSet,Transparent,Off,ahk_id %actwinid%
Return

如果索引为 1(又名Off),则值为 255。如果值为 255,则将 的标记值Off发送到底层 API,从而关闭透明度。否则,将应用透明度。

应用我的 diff 后,代码变成:

SETTRANSPACT:
WinSet,Transparent,%atransparency%,ahk_id %actwinid%
If atransparency=255
{
   WinSet, ExStyle, -0x20, ahk_id %actwinid%
   WinSet,Transparent,Off,ahk_id %actwinid%
}
Else
{
   WinSet, ExStyle, +0x80020, ahk_id %actwinid%
}
Return

它只是添加了两WinSet, ExStyle行(和括号,因为我内心的 Java 开发人员认为向 AHK2 的过渡不可能更早到来),以便当透明度不是 100%(即不是 255)时启用鼠标点击功能,而当您单击时Off(并且它是 255)禁用鼠标点击功能。

这有点儿不靠谱,但在我测试的短时间内,它是有效的。需要注意的是,如果你想要更改它,你必须按 ALT-TAB 切换到窗口(因为它是不可点击的)。

我没有像 Edison Hua 那样进行过边界测试,所以这可能会与现有的窗口设置发生冲突,但我希望这个答案至少能为未来的讨论提供一个起点,因为我花了半天时间试图找到我认为是 Windows 的一个简单功能。

相关内容