Я решил проблему о следующем пункте:
Я не могу восстановить в меню для
О вашей проблеме в другой точке
Мне нужно удалить границы дважды, первый раз, когда строка меню все еще существует.
У меня нет решения, что извинит, но я надеюсь, что другие люди помогут с этим.
Удалите весь код, который определяет ваш метод RemoveBorders, который вы отправили в своем вопросе, и затем выберите весь следующий код, который я опубликовал ниже (используйте Ctrl + A, если он работает), скопируйте его (щелкните правой кнопкой мыши щелкните => выберите «Копировать» или просто нажмите Ctrl + C быстрее), а затем вставьте его (щелкните правой кнопкой мыши => выберите «Вставить» или просто нажмите Ctrl + V быстрее). Убедитесь, что позиция курсора в редакторе кода находится в правильном месте, где старый код, который определил ваш метод RemoveBorder, был перед вставкой нового кода. Мой новый код, который переопределяет RemoveBorders является:
public IntPtr RemoveBorders(IntPtr WindowHandle, IntPtr MenuHandle)
{
if (MenuHandle == IntPtr.Zero)
{
MenuHandle = GetMenu(WindowHandle);
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));
return MenuHandle;
}
Изменения, которые были сделаны из старой версии моей новой версии методы RemoveBorders:
Прежде всего, возвращаемое значение методы изменяется от void
к IntPtr
, так что строки кода
return MenuHandle;
был добавлен ниже последнего вызова функции SetWindowLong
. Цель этого изменения состояла в том, чтобы программа RemoveBorders вернула дескриптор меню (как тип IntPtr в C#), который принадлежал окну, до того, как его границы были удалены из него. Это важно, потому что в следующий раз, когда вы снова вспомните RemoveBorders, чтобы восстановить границу окна, вам нужно вернуть дескриптор своего меню. Вот почему второй аргумент RemoveBorders (bool remove
) был изменен на IntPtr MenuHandle
, чтобы вы могли вернуть меню окна и восстановить его границы. В результате мне пришлось удалить перед MenuHandle в первой строке кода, чтобы объявить, что MenuHandle - это , а не локальная переменная, но теперь это аргумент. Установите этот аргумент в IntPtr.Zero (что означает NULL
в C++) всякий раз, когда вы хотите удалить границы окна. Из-за того, что удалить аргумент был заменен, и поэтому не существует в моей новой версии больше, код строка if (remove)
была изменена на
if (MenuHandle == IntPtr.Zero)
Он проверяет, что вы не дали ручки меню на окна, то вы хотите удалить его границы. Действие выполняется внутри оператора if. Если вы вернете меню окна, то MenuHandle не будет NULL
(т. Е.IntPtr.Zero
), а затем код вводится в оператор else для восстановления. Последнее значение очень важно. Изменение заключалось в том, чтобы переместить первую строку кода, где был удален IntPtr, и когда вы вызываете функцию GetMenu внутри блока оператора if, перед вызовом функции GetMenuItemCount, потому что нам нужно получить меню окна и сохранить его , прежде чем его границы будут удалены, а не всегда. Без этого изменения вы не сможете восстановить границы окна, потому что первая строка кода «отбросит» меню окна, которое вы вернули, потому что вы вызываете функцию GetMenu, когда в окне нет меню, поэтому возвращаемое значение этой функции будет NULL (IntPtr.Zero в C#), поэтому в блоке else вы устанавливаете меню окна на IntPtr.Zero
(что означает NULL
на C++). С этим изменением новый метод RemoveBorders должен работать правильно и позволить вам восстанавливать границы окна.
Отныне вы должны использовать мою новую версию для RemoveBorders вместо старой версии, чтобы иметь возможность восстанавливать границы окна. Надеюсь, вы поняли мою идею в этом изменении. Инструкции просты: определите новую переменную типа IntPtr
, и всякий раз, когда вы вызываете RemoveBorders, чтобы удалить границу окна, назначьте эту переменную возвращаемому значению метода, чтобы сохранить и сохранить меню окна, после того как его границы были удалены , Позже вы снова вспомните RemoveBorders, но теперь для восстановления границ окна, поэтому вы устанавливаете второй аргумент переменной, которая хранит меню окна, то есть возвращаемое значение предыдущего вызова метода RemoveBorders. Надеюсь, что это поможет!
Вам необходимо «RedrawWindow» с 'RDW_FRAMECHANGED', чтобы перерисовать с новыми границами. Разве вы не должны использовать свойство 'FormBorderStyle', а не стирать стили? –
Спасибо, но я не получаю границы с этой функцией. Я использовал: «RedrawWindowFlags.Invalidate And RedrawWindowFlags.Frame» – Laurence
К сожалению, память не удалась. Должно быть «SWP_FRAMECHANGED». Но почему вы завинчиваете окна, принадлежащие другому процессу? Это грубо. –