.. а заодно и caption-less + border-less
Изначальной целью было избавиться от скролл-баров во всех режимах,
сохраняя длинный буфер (история вывода консоли).
Смысл:
скролбар постоянно налазил на правый край заслоняя часы и внутренние скрол-бары самого ФАРа,
(я уже начал забывать когда последний раз нормально видел правый край ФАРа!)
и кроме того в увеличении рабочей поверхности ФАРа.
Как альтернатива можно было бы прибегнуть к Conemu,
но хотелось выяснить так ли нужен аж целый Conemu для победы над скрол-баром.
Бонусом получился режим похожий на стародавний (pre Windows Vista) full-screen mode.
В целом эксперимент закончился успехом, ФАР стал занимать всю ширину и высоту экрана.
Привожу концептуальный код на C#, основанный на p-invoke.
этот код кладется в ЕХЕ, который запускается в RunAfterFARStart,
можно запускать и в любом другом месте внутри ФАРа.
У меня работает как на x86 так и на х64.
Code: Select all
..
private static void _ScrollBarLess_FAR(string[] args)
{
const int GWL_STYLE = (-16);
const int GWL_EXSTYLE = (-20);
int the_pid = -1, parent_pid = -1;
IntPtr hWnd = IntPtr.Zero;
Console.WriteLine("hello, we have {0} args", args.Length);
System.Diagnostics.Process p_self = System.Diagnostics.Process.GetCurrentProcess(), p_parent = null;
if (args.Length > 0 && int.TryParse(args[0], out the_pid))
{
Console.WriteLine("The FAR PID is: {0}", the_pid);
System.Diagnostics.Process p1 = System.Diagnostics.Process.GetProcessById(the_pid);
hWnd = p1.MainWindowHandle;
}
else
{
p_parent = GetParentProcess(p_self.Id);
parent_pid = p_parent.Id;
Console.WriteLine("Parent process name is {0}", p_parent.ProcessName);
if (p_parent.ProcessName.ToLower() == "far")
hWnd = p_parent.MainWindowHandle;
}
WindowStyles wndStyle = (WindowStyles)GetWindowLongPtr(hWnd, GWL_STYLE);
Console.WriteLine("Style: {0}", wndStyle);
wndStyle &= ~WindowStyles.WS_HSCROLL;
wndStyle &= ~WindowStyles.WS_VSCROLL;
wndStyle &= ~WindowStyles.WS_BORDER;
wndStyle &= ~WindowStyles.WS_THICKFRAME;
wndStyle &= ~WindowStyles.WS_CAPTION;
wndStyle &= ~WindowStyles.WS_EX_LEFTSCROLLBAR;
wndStyle &= ~WindowStyles.WS_EX_RIGHTSCROLLBAR;
IntPtr res_1 = SetWindowLongPtr(hWnd, GWL_STYLE, (IntPtr)wndStyle);
WindowStyles wndStyleEx = (WindowStyles)GetWindowLongPtr(hWnd, GWL_EXSTYLE);
Console.WriteLine("Style ext: {0}", wndStyleEx);
wndStyleEx &= ~WindowStyles.WS_EX_LEFTSCROLLBAR;
wndStyleEx &= ~WindowStyles.WS_EX_RIGHTSCROLLBAR;
wndStyleEx &= ~WindowStyles.WS_EX_STATICEDGE;
wndStyleEx &= ~WindowStyles.WS_EX_WINDOWEDGE;
wndStyleEx &= ~WindowStyles.WS_EX_CLIENTEDGE;
wndStyleEx &= ~WindowStyles.WS_EX_APPWINDOW;
IntPtr res_2 = SetWindowLongPtr(hWnd, GWL_EXSTYLE, (IntPtr)wndStyleEx);
Console.WriteLine("Successfully ({0}, {1}) set window styles for process {2}/{3}", res_1, res_2, p_parent == null ? "(given)" : p_parent.ProcessName, parent_pid);
}
..
тогда будет возможно избавиться от зависимости в компиляции ЕХЕ и связанного с этим
Ссылки по теме:
https://docs.microsoft.com/en-us/window ... dow-styles
https://docs.microsoft.com/en-us/window ... dow-styles
http://pinvoke.net/default.aspx/Enums/WindowStyles.html