Scrollbar-less fullscreen FAR window in Windows7

Здесь обсуждается всё, что касается макросов.
Post Reply
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

Scrollbar-less fullscreen FAR window in Windows7

Post by citRiks »

Scrollbar-less fullscreen FAR window in Windows7
.. а заодно и 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);
}
..
буду более чем счастлив сотрудничеству с желающими и способными перевести код в FFI,
тогда будет возможно избавиться от зависимости в компиляции ЕХЕ и связанного с этим

Ссылки по теме:
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
Last edited by citRiks on Mon 06 Apr, 2020 11:54, edited 7 times in total.
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
citRiks
Posts: 1105
Joined: Fri 25 Oct, 2019 18:18
Has thanked: 345 times
Been thanked: 57 times

Scrollbar-less fullscreen FAR window in Windows7

Post by citRiks »

Из зала принесли записку, сообщают что вышеуказанная проблема и решение заключаются в настройках:

Code: Select all

System.WindowMode                         │boolean│true
System.WindowMode.StickyX                 │boolean│true
System.WindowMode.StickyY                 │boolean│true
Screen.DeltaX                             │integer│-1
Screen.DeltaY                             │integer│-1
Указанные параметры являются оптимальными, и половина из них не дефолтныe
А кто не поверит в наше миролюбие, / Тот кровью умоется. / И будет такая борьба за мир, / Что камня на камне не останется.
Post Reply

Return to “Обсуждение макросов”