窗口句柄为hWnd,用SetWindowLong设置无边框如何表达
时间: 2024-04-09 21:30:59 浏览: 18
要使用SetWindowLong函数设置窗口为无边框样式,可以通过以下步骤进行:
1. 获取窗口的当前样式:
```cpp
LONG_PTR dwStyle = GetWindowLongPtr(hWnd, GWL_STYLE);
```
2. 移除边框样式:
```cpp
dwStyle = dwStyle & ~WS_BORDER; // 移除边框样式
```
3. 设置新的窗口样式:
```cpp
SetWindowLongPtr(hWnd, GWL_STYLE, dwStyle);
```
4. 调整窗口的大小和位置,以便适应新的样式(可选):
```cpp
SetWindowPos(hWnd, NULL, x, y, width, height, SWP_FRAMECHANGED);
```
其中,hWnd是窗口句柄,通过GetWindowLongPtr函数获取当前窗口样式,然后通过按位与运算符和取反运算符来移除边框样式。最后,使用SetWindowLongPtr函数将新的样式应用于窗口。如果需要调整窗口的大小和位置以适应新的样式,可以使用SetWindowPos函数。
需要注意的是,这只是设置窗口为无边框样式的基本示例,具体的实现可能还需要考虑其他因素,如窗口大小、位置等。
相关问题
使用qt获取其他程序窗口句柄时如何带上窗口的最大化最小化及关闭
获取其他程序窗口句柄后,可以使用 WinAPI 中的 SetWindowLong 函数来设置窗口的样式和行为,包括最大化、最小化、关闭等。具体步骤如下:
1. 在头文件中引入 Windows.h
```cpp
#include <Windows.h>
```
2. 获取其他程序窗口句柄
```cpp
HWND targetHwnd = FindWindow(NULL, "目标窗口标题");
```
3. 设置窗口样式和行为
```cpp
LONG_PTR style = GetWindowLongPtr(targetHwnd, GWL_STYLE);
style &= ~WS_CAPTION; //去掉标题栏
style &= ~WS_THICKFRAME; //去掉边框
style &= ~WS_MINIMIZEBOX; //去掉最小化按钮
style &= ~WS_MAXIMIZEBOX; //去掉最大化按钮
style |= WS_POPUP; //设置为弹出式窗口
SetWindowLongPtr(targetHwnd, GWL_STYLE, style);
LONG_PTR exStyle = GetWindowLongPtr(targetHwnd, GWL_EXSTYLE);
exStyle &= ~WS_EX_DLGMODALFRAME; //去掉对话框边框
exStyle &= ~WS_EX_CLIENTEDGE; //去掉客户端边框
exStyle &= ~WS_EX_STATICEDGE; //去掉静态边框
exStyle &= ~WS_EX_WINDOWEDGE; //去掉窗口边框
SetWindowLongPtr(targetHwnd, GWL_EXSTYLE, exStyle);
SetWindowPos(targetHwnd, HWND_TOP, 0, 0, 800, 600, SWP_FRAMECHANGED);
```
其中,第一个参数表示要设置的窗口句柄,第二个参数表示要设置的属性,第三个参数表示要设置的值。最后一行代码中,SetWindowPos 函数可以设置窗口的位置、大小和 Z 轴顺序,并刷新窗口边框。
注:在设置其他程序窗口的样式和行为时,需要确保程序以管理员权限运行,否则可能会导致设置失败。
api 句柄窗口关闭前取消窗口的所有者关系
在 Win32 API 中,可以使用 `SetWindowLong` 函数来修改窗口的所有者,从而取消窗口所有者关系。可以在 `WM_CLOSE` 消息的处理函数中取消窗口的所有者关系,从而实现在窗口关闭前取消所有者关系的功能。
具体操作步骤如下:
1. 定义窗口过程函数:
```
[DllImport("user32.dll")]
private static extern IntPtr DefWindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
private const uint WM_CLOSE = 0x0010;
private static IntPtr WindowProc(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam)
{
switch (uMsg)
{
case WM_CLOSE:
// 取消窗口所有者关系
SetWindowLong(hWnd, GWL_HWNDPARENT, IntPtr.Zero);
break;
default:
break;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
```
其中 `WM_CLOSE` 表示窗口关闭消息,`SetWindowLong` 函数用于取消窗口所有者关系。
2. 创建窗口并设置窗口过程函数:
```
[DllImport("user32.dll")]
private static extern IntPtr CreateWindowEx(
uint dwExStyle,
string lpClassName,
string lpWindowName,
uint dwStyle,
int x,
int y,
int nWidth,
int nHeight,
IntPtr hWndParent,
IntPtr hMenu,
IntPtr hInstance,
IntPtr lpParam);
private static readonly string className = "MyClassName";
IntPtr hWnd = CreateWindowEx(
0,
className,
"MyWindow",
WS_OVERLAPPEDWINDOW,
0,
0,
640,
480,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero,
IntPtr.Zero);
// 设置窗口过程函数
SetWindowLong(hWnd, GWL_WNDPROC, Marshal.GetFunctionPointerForDelegate(new WindowProcDelegate(WindowProc)));
```
其中 `CreateWindowEx` 函数用于创建窗口,`SetWindowLong` 函数用于设置窗口过程函数。
3. 显示窗口并进入消息循环:
```
[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
private const int SW_SHOW = 5;
ShowWindow(hWnd, SW_SHOW);
MSG msg;
while (GetMessage(out msg, IntPtr.Zero, 0, 0))
{
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
```
其中 `ShowWindow` 函数用于显示窗口,`GetMessage`、`TranslateMessage` 和 `DispatchMessage` 函数用于进入消息循环。
这样,在窗口关闭前就可以取消窗口的所有者关系。需要注意的是,取消所有者关系可能会导致子窗口无法正常显示,因此建议在确定不需要窗口所有者关系时再进行取消操作。