Windows 7の場合と同様にWindowsで作業する:更新

Windowsでウィンドウを操作するためのプログラム、アイデアと便利さはWindows 7から借用されました。このプログラムを使用すると、ホットキーを使用して画面上でウィンドウを移動し、最大化、通常のウィンドウのステージに配置できます。 VistaおよびWinXP(x86とx64の両方)で動作します。

新しいバージョンのプログラムでは、いくつかのエラーが修正されています。
a)ダイアログ(サイズ変更できないダイアログ)は最小化されませんでした。
b)プログラムはGoogle Chromeウィンドウでは機能しませんでした(これについては、以下で少し説明します)。
また、 画面間でウィンドウを移動するための主な機能も追加されています
ここから新しいバージョンをダウンロードできます。

まず、Chromeの問題について少し説明します。 私は彼女を見つけませんでした。 Chromeバージョン2.0.160.0があり、Vistaで試しました。 しかし、それでも、IsResizableWindowのウィンドウをチェックするメソッドにこのようなチェックを追加する別のアセンブリを作成しました
StringBuilder sb = new StringBuilder (100);
if (WAWindows.GetClassName(window, sb, sb.Capacity) != IntPtr .Zero
&& sb.ToString().StartsWith( "Chrome_" ))
return true ;


* This source code was highlighted with Source Code Highlighter .

うまくいくようです。

次に、画面間でウィンドウを移動します。 タスクはそれほど難しくありませんでした。 最初に行うことは、ユーザーがまだウィンドウを移動したいモニターを決定することです。その後、額を行い、すべての画面を移動し、タッチするもの(タッチ側は押されたキーに依存します)を送信し、それを送信する必要があります、ここに画面の場所コードがあります:
private static Screen GetScreenToMove(Screen screen, Keys keys)
{
foreach (Screen scr in Screen.AllScreens)
{
if (!scr.Equals(screen))
{
switch (keys)
{
case Keys.Left:
if (scr.WorkingArea.Right == screen.WorkingArea.Left
&& scr.WorkingArea.Top == scr.WorkingArea.Top)
return scr;
break ;
case Keys.Right:
if (scr.WorkingArea.Left == screen.WorkingArea.Right
&& scr.WorkingArea.Top == scr.WorkingArea.Top)
return scr;
break ;
case Keys.Down:
if (scr.WorkingArea.Top == screen.WorkingArea.Bottom
&& scr.WorkingArea.Left == scr.WorkingArea.Left)
return scr;
break ;
case Keys.Up:
if (scr.WorkingArea.Bottom == screen.WorkingArea.Top
&& scr.WorkingArea.Left == scr.WorkingArea.Left)
return scr;
break ;
}
}
}
return null ;
}


* This source code was highlighted with Source Code Highlighter .
次に、選択した画面にウィンドウを送信するだけで、比率を考慮してウィンドウを送信します。つまり、ウィンドウが画面の50%を占める場合、新しい画面で同じ量を占有します。
しかし、FullScreenアプリケーションには問題がありました。たとえば、フィルムがフルスクリーンに拡張され、このウィンドウを別のスクリーンに転送しようとした場合-何も起こりませんでしたが、このウィンドウはWsSizeBoxを持つと定義されていなかったので、次の方法でそれらを認識しなければなりませんでした(ここで誰かが私にもっと有能なことを教えてくれますか?):
private static bool IsFullScreenWindow(WAWindows.Rect rect, Screen scr)
{
return rect.Left == scr.Bounds.Left && rect.Top == scr.Bounds.Top
&& rect.Width == scr.Bounds.Width && rect.Height == scr.Bounds.Height;
}


* This source code was highlighted with Source Code Highlighter .
もう1つの興味深い事実は、FullScreenウィンドウを画面間で移動すると、ある時点で単に失われることです。ウィンドウが古い画面に残っていることに気付き、新しい画面のサイズと位置を設定します。 解決策:寸法を設定するとき、最初に寸法を画面の高さよりも小さい数ピクセル幅に設定して(ウィンドウがこの画面に正確に収まるように)、次にフルスクリーンサイズに復元する必要があります
// Fix for full screen windows
if (isFullScreenWindow)
WAWindows.SetWindowPos(window, WAWindows.HwndTop, x + 1, y + 1, cx - 2, cy - 2, WAWindows.SwpShowWindow);

WAWindows.SetWindowPos(window, WAWindows.HwndTop, x, y, cx, cy, WAWindows.SwpShowWindow);


* This source code was highlighted with Source Code Highlighter .
別の不快な瞬間は、ある画面のウィンドウが最大化されたときに別の画面に移動し、それを通常に復元し、最大化され、ウィンドウがそのサイズと場所を覚えていたため、前の画面に飛ぶことでしたそのような場合、そのようなFIXを書きます:
// Fixed problem with restore on other screen
Screen newScreen = Screen.FromHandle(window);
if (!newScreen.Equals(screen))
{
if (WAWindows.GetWindowRect(window, out rect))
MoveToNewScreen(window, newScreen, screen, rect, isResizableWindow, false );
}


* This source code was highlighted with Source Code Highlighter .
これは私が遭遇したすべての不快な瞬間のようなものです。 提案やコメントがあれば、喜んで聞いてみます。

PS私はまた、Andir Rから次の言葉を含む提案とパッチを含む手紙を受け取りました。

二重最大化の可能性を追加しました。 一番下の行は次のとおりです。
1)最初の最大化(ホットキーを使用)では、ウィンドウは
最大化され、設定サイズが変更され、
2)二次最大化はすでに実際の最大化を引き起こします。

その逆も同じです。

これが必要な理由:
高解像度、フルウィンドウ最大化を備えたワイドモニターでは、
多くの場合、まったく必要ありませんが、特定のウィンドウを増やすために
サイズはまだ必要です。

この機能はそれほど必要ではないと思われました。少なくとも私は絶対に使用しません。ほとんどの人がそれを必要とする場合は、何らかの形でプロジェクトに含めます。

Source: https://habr.com/ru/post/J58527/


All Articles