SetWindowLong 设置为WS_EX_ACTIVE
时间: 2023-08-11 13:04:36 浏览: 44
如果使用`SetWindowLong`函数将外部窗体样式设置为`WS_EX_ACTIVE`,则会使窗口始终处于激活状态,即使用户切换到其他窗口,该窗口也会保持在最前面。这可能会影响用户的操作体验,所以不建议这样做。
如果你想让窗口在用户切换到其他窗口时失去焦点,可以使用`SetForegroundWindow`函数,将焦点设置到其他窗口上。具体方式如下:
```csharp
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
Process process = new Process();
process.StartInfo.FileName = "path/to/your/program.exe";
process.Start();
process.WaitForInputIdle();
IntPtr hWnd = process.MainWindowHandle;
SetForegroundWindow(hWnd);
```
在这个示例中,我们使用`SetForegroundWindow`函数将焦点设置到外部程序的窗口上,这样就可以在用户切换到其他窗口时使该窗口失去焦点。
相关问题
SetWindowLong(_hwnd, GWL_EXSTYLE, WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW); 用这条代码使鼠标可以穿过窗体,直接点击桌面,但是没有办法取消鼠标穿透。
### 回答1:
这条代码设置了一个窗口的扩展样式,其中包含了 WS_EX_TOPMOST、WS_EX_LAYERED、WS_EX_TRANSPARENT 和 WS_EX_TOOLWINDOW 四种样式。其中,WS_EX_TOPMOST 表示这个窗口总在最上面,WS_EX_LAYERED 表示这个窗口使用颜色加权混合方式绘制,WS_EX_TRANSPARENT 表示这个窗口是透明的,WS_EX_TOOLWINDOW 表示这个窗口是一个工具窗口。这条代码将扩展样式设置为这些样式的组合,从而使得鼠标可以穿过窗体,直接点击桌面。但是,这条代码并没有提供取消鼠标穿透的方法。如果想要取消鼠标穿透,你可以将窗口的扩展样式设置为不包含 WS_EX_TRANSPARENT 的样式,这样就可以解除鼠标穿透效果了。
### 回答2:
使用SetWindowLong函数来设置窗口的扩展样式,包括WS_EX_TOPMOST、WS_EX_LAYERED、WS_EX_TRANSPARENT和WS_EX_TOOLWINDOW。其中WS_EX_TOPMOST将窗口设置为最顶层,WS_EX_LAYERED使窗口支持透明效果,WS_EX_TRANSPARENT使窗口透明,并且允许鼠标穿透,WS_EX_TOOLWINDOW将窗口标识为工具窗口。
通过使用以上代码,可以使鼠标可以穿过窗体,直接点击桌面。但是在没有其他的代码进行修改的情况下,无法取消鼠标穿透。如果要取消鼠标穿透,需要进行进一步的操作。
可以使用以下代码取消鼠标穿透功能:
SetWindowLong(_hwnd, GWL_EXSTYLE, GetWindowLong(_hwnd, GWL_EXSTYLE) & ~WS_EX_TRANSPARENT);
通过使用GetWindowLong函数获取当前窗口的扩展样式,并且取消WS_EX_TRANSPARENT标志位,最后通过SetWindowLong函数重新设置窗口的扩展样式。
注意:以上操作仅针对当前窗口进行修改,如果要取消其他窗口的鼠标穿透功能,需要在相应的窗口句柄上进行相同的操作。
### 回答3:
使用SetWindowLong函数设置窗体的扩展样式,包括WS_EX_TOPMOST(窗体置顶)、WS_EX_LAYERED(窗体透明)、WS_EX_TRANSPARENT(鼠标穿透)和WS_EX_TOOLWINDOW(工具窗口)。通过将这些扩展样式使用按位或运算符合并在一起,通过_hwnd参数指定窗体的句柄,可以使鼠标可以穿过窗体直接点击桌面。
然而,根据提供的代码,没有提供取消鼠标穿透的方法。调用SetWindowLong函数并设置新的窗体扩展样式后,将无法通过类似的方式来取消鼠标穿透。如果要取消鼠标穿透,需要重新调用SetWindowLong函数,并在GWL_EXSTYLE参数中使用原始窗体的扩展样式,而不包括WS_EX_TRANSPARENT。这将覆盖之前设置的样式,从而实现取消鼠标穿透的效果。
具体的代码示例如下:
```c++
// 设置窗体的扩展样式,包括鼠标穿透
SetWindowLong(_hwnd, GWL_EXSTYLE, WS_EX_TOPMOST | WS_EX_LAYERED | WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW);
// 要取消鼠标穿透,重新设置窗体的扩展样式,将原始样式设置回去(不包括WS_EX_TRANSPARENT)
SetWindowLong(_hwnd, GWL_EXSTYLE, originalExStyle);
```
需注意的是,originalExStyle代表窗体在调用SetWindowLong函数前的扩展样式,需要在调用该函数之前保留该值,以便在取消鼠标穿透时恢复窗体的原始样式。
希望以上解答能对您有所帮助。
WS_EX_TRANSPARENT
WS_EX_TRANSPARENT是一个窗口扩展样式常量,用于设置窗口的透明属性。当使用SetWindowLong函数将GWL_EXSTYLE参数设置为WS_EX_TRANSPARENT时,窗口将变为透明。这意味着用户可以看到窗口下面的内容,但无法与窗口进行交互,例如点击窗口上的按钮或输入文本。
然而,当窗口设置为WS_EX_TRANSPARENT时,窗口将无法接收触摸消息,只能接收鼠标消息。这意味着用户无法使用触摸屏对窗口进行交互。这个问题已经被官方确认并报告了。
总之,WS_EX_TRANSPARENT是一个用于设置窗口透明的常量,但需要注意的是,使用该样式可能会导致窗口无法接收触摸消息。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Delphi添加图层蒙版.rar](https://download.csdn.net/download/weixin_39840387/11315906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [WPF 设置 WS_EX_TRANSPARENT 触摸失效](https://blog.csdn.net/lindexi_gd/article/details/106810636)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]