UPDATE 2015 : Emacs 24.4 には、Windows を使用した真のフルスクリーン サポートが含まれていますtoggle-frame-fullscreen
。Windows 用の GNU ビルドを変更せずに使用できます (または、おそらく他のビルドも)。
問題は、GUI がウィンドウを文字単位でサイズ変更することです。これは Windows のみの問題です。これは、frame-parameter
ネイティブ フルスクリーンに変換される がなく、サイズ変更と配置によってフルスクリーン モードを実現する必要があるためです。
EmacsW32パッチが適用されたビルドが必要です。
このダウンロード ページから最新のインストーラー (現在は Emacs-24-BzrP110217-EmacsW32-1.58.exe) を入手してください。
これをemacs-fullscreen-w32 (Windows API を使用してタイトルバーを削除する) などと組み合わせて使用すると、真のフルスクリーンが得られます。
Windows のギャップを解消する 方法は他にありません。
個人的には、自分のリポジトリで誰かの EXE をいじるのが好きではなかった.emacs
ので、次の C# プログラムを使用します (この bitbucket プロジェクトから取得しました)。
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Text.RegularExpressions;
namespace toggleTitle
{
class Program
{
// Constants from WinUser.h
const int GWL_STYLE = -16;
const int GWL_EXSTYLE = -20;
const int SW_MAXIMIZE = 3;
const uint WS_CAPTION = 0x00C00000;
const uint WS_BORDER = 0x00800000;
const uint WS_SIZEBOX = 0x000040000;
// Imports from user32.dll
[DllImport("User32", CharSet = CharSet.Auto)]
private static extern int SetWindowLong(IntPtr hWnd, int Index, int Value);
[DllImport("User32", CharSet = CharSet.Auto)]
private static extern int GetWindowLong(IntPtr hWnd, int Index);
[DllImport("user32.dll")]
private static extern int ShowWindow(int hwnd, int command);
// -- main functions
static int GetWindowStyle(int hwnd) {
return GetWindowLong(new IntPtr(hwnd), GWL_STYLE);
}
static void ToggleWindowCaption(int hwnd) {
IntPtr intPtrHWND = new IntPtr(hwnd);
int currentStyle = GetWindowStyle(hwnd);
int newStyle = currentStyle ^ (int) WS_CAPTION;
newStyle = newStyle ^ (int)WS_BORDER;
newStyle = newStyle ^ (int)WS_SIZEBOX;
SetWindowLong(intPtrHWND, GWL_STYLE, newStyle);
WinApi.SetWinFullScreen(intPtrHWND);
//ShowWindow(hwnd, SW_MAXIMIZE);
}
static List<Process> FindWindows(Regex regexpToMatch) {
List<Process> results = new List<Process>();
foreach (Process win in Process.GetProcesses()) {
if (regexpToMatch.IsMatch(win.MainWindowTitle)) {
results.Add(win);
}
}
return results;
}
static void Main(string[] args) {
System.Console.WriteLine("== toggle windows ==");
if (args.Length < 1) {
Console.WriteLine("Usage: togglecaption <hwnd>");
return;
}
int windowHwnd = Int32.Parse(args[0]);
foreach (Process proc in Process.GetProcesses()) {
if (proc.MainWindowHandle == new IntPtr(windowHwnd)) {
System.Console.WriteLine(proc.MainWindowTitle);
Console.WriteLine("Toggled WS_CAPTION on: " + proc.MainWindowTitle);
ToggleWindowCaption(windowHwnd);
return;
}
}
Console.WriteLine("hwnd not found. Exiting.");
}
}
public class WinApi
{
[DllImport("user32.dll", EntryPoint = "GetSystemMetrics")]
public static extern int GetSystemMetrics(int which);
[DllImport("user32.dll")]
public static extern void
SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter,
int X, int Y, int width, int height, uint flags);
private const int SM_CXSCREEN = 0;
private const int SM_CYSCREEN = 1;
private static IntPtr HWND_TOP = IntPtr.Zero;
private const int SWP_SHOWWINDOW = 64; // 0×0040
private const int SWP_NOSIZE = 1;
private const int SWP_NOMOVE = 2;
public static int ScreenX
{
get { return GetSystemMetrics(SM_CXSCREEN);}
}
public static int ScreenY
{
get { return GetSystemMetrics(SM_CYSCREEN);}
}
public static void SetWinFullScreen(IntPtr hwnd)
{
SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE);
SetWindowPos(hwnd, HWND_TOP, 0, 0, ScreenX + 7, ScreenY + 7, SWP_SHOWWINDOW | SWP_NOMOVE);
}
}
}
これは単純な
csc /out:w32toggletitle.exe *.cs
.NET Framework ディレクトリがパスにある場合。
結果の EXE を自分のパスに配置し、次の elisp コードを使用してそれを呼び出します (これもさまざまなソースから変更されています)。
(setq gpc/frame-box-before-fullscreen nil)
(defun toggle-titlebar ()
"Toggles the titlebar on the current frame (Windows only)."
(interactive)
(call-process (dot-emacs "winpatch/bin/w32toggletitle.exe")
nil nil nil
(frame-parameter (selected-frame) 'window-id)))
(defun toggle-fullscreen ()
"Toggle fullscreen."
(interactive)
(if (frame-parameter nil 'fullscreen)
(fullscreen-off)
(fullscreen-on)))
(defun fullscreen-on ()
"Makes emacs frame occupy the full screen, even on Windows."
(interactive)
(setq gpc/frame-box-before-fullscreen
`((top . ,(frame-parameter nil 'top))
(left . ,(frame-parameter nil 'left))
(width . ,(frame-parameter nil 'width))
(height . ,(frame-parameter nil 'height))))
(when (eq window-system 'w32)
(unless (frame-parameter nil 'fullscreen)
(toggle-titlebar))
(w32-send-sys-command 61488))
(set-frame-parameter nil 'fullscreen 'fullboth))
(defun fullscreen-off ()
"Restore frame from fullscreen mode (Windows only... I think)"
(interactive)
(when (eq window-system 'w32)
(w32-send-sys-command 61728)
;; HACK to test if titlebar is on or off
(if (frame-parameter nil 'fullscreen)
(toggle-titlebar)))
(set-frame-parameter nil 'fullscreen nil)
(modify-frame-parameters nil gpc/frame-box-before-fullscreen))
私はそれから使用します
(global-set-key (kbd "<f11>") 'toggle-fullscreen)
GUI モードの場合、ウィンドウ位置の保存/復元を含め、F11 が期待どおりに機能するようにします。
私は個人的にこれにあまりにも多くの時間を費やしてきたので、これが他の誰かを行き止まりから救うことを願っています.
要するに、Windows で真の emacs フルスクリーンが必要な場合は、Lennart のパッチを使用してください。GNU ビルドと Cygwin w32 ビルドはすべて、ウィンドウ サイズを文字全体に強制します。