これを試してください。これは私のために働く。この例では、境界線とメニューの削除はアプリ内部で行われます。しかし、少し調整するだけで、外部のウィンドウでも機能させることができます。
これらは私が私のコードあなたがこれを行うことができ、メニューについては
const uint WS_BORDER = 0x00800000;
const uint WS_DLGFRAME = 0x00400000;
const uint WS_THICKFRAME = 0x00040000;
const uint WS_CAPTION = WS_BORDER | WS_DLGFRAME;
const uint WS_MINIMIZE = 0x20000000;
const uint WS_MAXIMIZE = 0x01000000;
const uint WS_SYSMENU = 0x00080000;
const uint WS_VISIBLE = 0x10000000;
const int GWL_STYLE = -16;
ウィンドウの境界については
Point originallocation = this.Location;
Size originalsize = this.Size;
public void RemoveBorder(IntPtr windowHandle, bool removeBorder)
{
uint currentstyle = (uint)GetWindowLongPtr(this.Handle, GWL_STYLE).ToInt64();
uint[] styles = new uint[] { WS_CAPTION, WS_THICKFRAME, WS_MINIMIZE, WS_MAXIMIZE, WS_SYSMENU };
foreach (uint style in styles)
{
if ((currentstyle & style) != 0)
{
if(removeBorder)
{
currentstyle &= ~style;
}
else
{
currentstyle |= style;
}
}
}
SetWindowLongPtr(windowHandle, GWL_STYLE, (IntPtr)(currentstyle));
//this resizes the window to the client area and back. Also forces the window to redraw.
if(removeBorder)
{
SetWindowPosPtr(this.Handle, (IntPtr)0, this.PointToScreen(this.ClientRectangle.Location).X, this.PointToScreen(this.ClientRectangle.Location).Y, this.ClientRectangle.Width, this.ClientRectangle.Height, 0);
}
else
{
SetWindowPosPtr(this.Handle, (IntPtr)0, originallocation.X, originallocation.Y, originalsize.Width, originalsize.Height, 0);
}
}
に宣言し、いくつかの定数です。
public void RemoveMenu(IntPtr menuHandle, bool removeMenu)
{
uint menustyle = (uint)GetWindowLongPtr(menuStrip1.Handle, GWL_STYLE).ToInt64();
SetWindowLongPtr(menuStrip1.Handle, GWL_STYLE, (IntPtr)(menustyle^WS_VISIBLE));
// forces the window to redraw (makes the menu visible or not)
this.Refresh();
}
はまた、私が代わりにGetWindowLong、SetWindowLong関数とSetWindowPos INT/UINTの引数としてのIntPtrでGetWindowLongPtr、SetWindowLongPtrとSetWindowPosPtrを使用気づきます。これは、x86/x64との互換性のためです。ここで
は私がGetWindowLongPtr
[DllImport("user32.dll", EntryPoint = "GetWindowLong")]
public static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32.dll", EntryPoint = "GetWindowLongPtr")]
public static extern IntPtr GetWindowLong64(IntPtr hWnd, int nIndex);
public static IntPtr GetWindowLongPtr(IntPtr hWnd, int nIndex)
{
if (IntPtr.Size == 8)
{
return GetWindowLong64(hWnd, nIndex);
}
else
{
return new IntPtr(GetWindowLong(hWnd, nIndex));
}
}
ホープこのことができますインポートを行う方法です。
新しい枠線で再描画するには、 'RDW_FRAMECHANGED'で' RedrawWindow'する必要があります。スタイルを叩く代わりに 'FormBorderStyle'プロパティを使用してはいけませんか? –
ありがとうございますが、私はその機能を使って罫線を戻すことはありません。私は使用しました: "RedrawWindowFlags.InvalidateとRedrawWindowFlags.Frame" – Laurence
おっと、メモリが私に失敗しました。 'SWP_FRAMECHANGED'だったはずです。しかし、なぜあなたは別のプロセスに属しているウィンドウにうんざりしていますか?それは一種の失礼です。 –