【发布时间】:2012-04-26 16:38:00
【问题描述】:
我想在 C# 中删除另一个进程的窗口边框;我使用 RemoveMenu 删除边框。它几乎可以工作,但我还有 2 个问题:
- 我需要去掉两次边框,第一次菜单栏还在 存在。
- 我无法恢复菜单的
这是我已经写的:
public void RemoveBorders(IntPtr WindowHandle, bool Remove)
{
IntPtr MenuHandle = GetMenu(WindowHandle);
if (Remove)
{
int count = GetMenuItemCount(MenuHandle);
for (int i = 0; i < count; i++)
RemoveMenu(MenuHandle, 0, (0x40 | 0x10));
}
else
{
SetMenu(WindowHandle,MenuHandle);
}
int WindowStyle = GetWindowLong(WindowHandle, -16);
//Redraw
DrawMenuBar(WindowHandle);
SetWindowLong(WindowHandle, -16, (WindowStyle & ~0x00080000));
SetWindowLong(WindowHandle, -16, (WindowStyle & ~0x00800000 | 0x00400000));
}
谁能告诉我我做错了什么?我已经尝试保存 MenuHandle 并稍后恢复它,但这不起作用。
【问题讨论】:
-
您需要使用
RedrawWindow和RDW_FRAMECHANGED重新绘制新边框。你不应该使用FormBorderStyle属性而不是敲打样式吗? -
谢谢,但我没有使用该功能恢复边界。我用过:“RedrawWindowFlags.Invalidate 和 RedrawWindowFlags.Frame”
-
糟糕,我记错了。应该是
SWP_FRAMECHANGED。但是你为什么要搞砸属于另一个进程的窗口呢?这有点粗鲁。 -
我不是说它是否合法。我说这不礼貌。也许应用程序在你弄乱它之后正在重置它的样式。也许
SWP_FRAMECHANGED不能跨进程工作。也许你弄错了常数。 (例如,你没有说你是编译为 32 位还是 64 位。) -
GetWindowLong的参数在 64 位上是不同的。没有更好的方法来实现这一点,因为这不应该实现。