9

画面の解像度またはデスクトップのサイズよりも大きいウィンドウのサイズを、プログラムで、できれば手動で変更する必要があります。

MS-Windows XP/Vista では画面より大きいウィンドウ サイズが許可されていないため、この制限を回避するアイデアはありますか?

作業スペースを増やすために、ラップトップでパン効果を作ろうとしています。LCD サイズが小さい古いラップトップには、そのような機能がありました。

これを参照してください: http://www.experts-exchange.com/OS/Microsoft_Operating_Systems/Windows/98/Q_21832063.html

4

9 に答える 9

15

所有していないウィンドウのサイズを変更する場合(およびフックを使用せずに)、SWP_NOSENDCHANGING(0x0400)フラグを設定してWindowsSetWindowPosAPIを使用できます。

BOOL WINAPI SetWindowPos(
__in      HWND hWnd,
__in_opt  HWND hWndInsertAfter,
__in      int X,
__in      int Y,
__in      int cx,
__in      int cy,
__in      UINT uFlags // ** SWP_NOSENDCHANGING must be passed here **
);

これにより、WM_GETMINMAXINFO制限をトリガーするWM_WINDOWPOSCHANGINGメッセージが送信されなくなります。ウィンドウの他のサイズ設定では、メッセージが送信されてウィンドウサイズが適用されるため、制限によってウィンドウがデスクトップの制限されたサイズにスナップバックされます。

ウィンドウリサイザー(C#)

以下は、メモ帳のサイズを6000x6000に変更する小さなサンプルプログラムです(文字列「無題-メモ帳」をサイズ変更するウィンドウのタイトルに変更するか、コマンドライン引数からウィンドウ名と目的のサイズを取得します)

namespace Example
{
 class Program
 {
  [DllImport("USER32.DLL")]
  public static extern IntPtr FindWindow(String className, String windowName);

  [DllImport("USER32.DLL", SetLastError = true)]
  public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int left, int top, int width, int height, uint flags);

  static void Main(string[] args)
  {
   var TOP = new IntPtr(0);
   uint SHOWWINDOW = 0x0040, NOCOPYBITS = 0x0100, NOSENDCHANGING = 0x0400;
   var hwnd = FindWindow(null, "Untitled - Notepad");
   SetWindowPos(hwnd, TOP, 0, 0, 6000, 6000, NOCOPYBITS | NOSENDCHANGING | SHOWWINDOW);
  }
 }
}

制限と警告

このアプローチは一般的に機能しますが、ウィンドウのサイズ変更や便利な方法でのサイズ変更を妨げる可能性のあるいくつかの制限があります。

安全

Windows Vista以降、Microsoftはウィンドウメッセージのセキュリティを強化するように実装しました。実行可能ファイルは、それ自体のセキュリティコンテキスト以下のウィンドウとのみ対話できます。たとえば、[コンピュータの管理]ウィンドウ(常に昇格して実行されます)のサイズを変更するには、このプログラムも昇格して実行する必要があります。

Windowsとレイアウトロジックを修正

ウィンドウサイズは、プログラムによって受動的または能動的に適用される場合があります。サイズが強制されたウィンドウは、初期サイズを受動的に設定し、ユーザーがウィンドウのサイズを変更する機能を公開しません(たとえば、サイズグリップコントロールがありません)。これらのウィンドウは通常、説明されているようにメッセージを送信することでサイズを変更できますが、レイアウトロジックがないため、追加の空のクライアント領域以外は表示されません。

アクティブな強制機能を備えたWindowsは、WM_SIZEなどのWindowsメッセージをキャッチするか、より高度なレイアウトロジックで、サイズを監視します。これらのウィンドウはメッセージを受け入れる場合がありますが、独自のコードで最終的なサイズを制限または制限します。

いずれの場合も、固定サイズのWindowsには通常、大きなサイズを利用するためのレイアウトロジックがないため、強制的にサイズを変更してもメリットはありません。

WPF

WPFのWindowクラスにはHwndSource、WPFウィンドウに送信されるウィンドウメッセージを処理するがあります。プライベートメソッドは、、、、およびメッセージをLayoutFilterMessageキャッチします。この場合、メッセージはプライベートによって処理されます。プライベートは、事実上、フラグをバイパスして、WPFクライアント領域のを変更します。これは、レガシーWin32メッセージをWPFイベントに適応させるプロセス全体の一部です。WM_SYSCOMMANDWM_SIZINGWM_WINDOWPOSCHANGINGWM_SIZEWM_SIZEProcess_WM_SIZENOSENDCHANGINGRenderSize

正味の効果は、Win32ホストウィンドウのサイズが変更されることです(SizeToContentがSizeToContent.WidthAndHeightに設定されていない場合)が、NOSENDCHANGINGフラグが設定されていないかのように、WPFレンダリング領域はデスクトップ領域にロックされます。上記のコードサンプルをWPFアプリに対して実行すると、タスクバーまたはWindows-TabスイッチャーのウィンドウプレビューからAero Peekの6000x6000ウィンドウを確認できますが、WPFコンテンツとレイアウトロジックがクリップされていることも確認できます。デスクトップ領域。このように、WPFウィンドウはアクティブに適用されるウィンドウに似ていますが、特定のサイズを適用するのではなく、特定の最大値WM_WINDOWPOSCHANGING(RenderAreaの場合)を適用し、メッセージを考慮しません。

独自のアプリであり、 (を介して) Windowsフォームウィンドウ内でWPFをホストしている場合ElementHostは、ウィンドウのサイズを変更できます。WPFコンテンツは、デスクトップよりも大きいWindowsフォームウィンドウを尊重します。

その他のフレームワーク

GTKやQtなどの他のフレームワークは、サイズの動作と制限を強制する場合と強制しない場合があり、これらの制限を克服するために可能なさまざまな回避策がある場合があります。特定のプログラムは、ウィンドウメッセージを無視、書き換え、またはバイパスする可能性があり、フレームワークは、上記のWPFなど、アプリケーションのクラス全体にメッセージを適用できます。

SetWindowPos APIの詳細:

Process_WM_SIZEのメソッドの参照ソースHwndSource

http://referencesource.microsoft.com/#PresentationCore/Core/CSharp/System/Windows/Interop/HwndSource.cs,da4aa32ad121c1b9,references

于 2011-11-09T03:27:39.563 に答える
3

C# のこのコードは、あなたが求めることを行います。ウィンドウはデスクトップよりもはるかに広いです。

 protected override void WndProc(ref Message m) {
        if (m.ToString().Contains("GETMINMAXINFO")) {
            //Hent data
            MINMAXINFO obj = (MINMAXINFO)Marshal.PtrToStructure(m.LParam, typeof(MINMAXINFO));
            //Endre
            if (obj.ptMaxSize.X > 0) {
                obj.ptMaxSize.X = 60000;
                obj.ptMaxSize.Y = 60000;
                obj.ptMaxTrackSize.X = 60000;
                obj.ptMaxTrackSize.Y = 60000;
                //Oppdater
                Marshal.StructureToPtr(obj, m.LParam, true);
            }
        }
        if (m.ToString().Contains("WINDOWPOSCHANGING")) {
            //Hent data
            WINDOWPOS obj = (WINDOWPOS)Marshal.PtrToStructure(m.LParam, typeof(WINDOWPOS));
            //Endre
            if (obj.cx > 0) {
                obj.cx = 8000;
                //Oppdater
                Marshal.StructureToPtr(obj, m.LParam, true);
            }
        }
        //Debug.WriteLine(m.ToString());
        base.WndProc(ref m);
    }











    [StructLayout(LayoutKind.Sequential)]
    internal struct WINDOWPOS {
        internal IntPtr hwnd;
        internal IntPtr hWndInsertAfter;
        internal int x;
        internal int y;
        internal int cx;
        internal int cy;
        internal uint flags;
    }

    [StructLayout(LayoutKind.Sequential)]
    internal struct MINMAXINFO {
        internal POINT ptReserverd;
        internal POINT ptMaxSize;
        internal POINT ptMaxPosition;
        internal POINT ptMinTrackSize;
        internal POINT ptMaxTrackSize;
    }
    [StructLayout(LayoutKind.Sequential)]
    internal struct POINT {
        internal int X;
        internal int Y;
    }
于 2011-01-25T14:32:16.157 に答える
3

WinProc(); で次のコードのようなことを行うことができます。

case WM_GETMINMAXINFO:
    {
        LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam; 
        GetWindowRect(GetDesktopWindow(), &actualDesktop);
        lpmmi->ptMaxTrackSize.x = 3000;// set the value that you really need.
        lpmmi->ptMaxTrackSize.y = 3000;// set the value that you really need.
    }
    break;

アプリケーションは、このメッセージを使用して、ウィンドウのデフォルトの最大化サイズと位置、またはデフォルトの最小または最大追跡サイズをオーバーライドできます。

于 2016-04-07T06:02:13.477 に答える
1

Only the recommended screen resolutions are listed. For additional settings, click the Advanced button on the Settings tab, click the Adapter tab, and then click List all Modes. Select the resolution, color level, and refresh rate you want.

I've just did it, here you can find the answer in the last point.

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/display_change_screen_resolution.mspx?mfr=true

于 2011-11-06T21:14:36.100 に答える
1

ウィンドウのサイズは、画面の解像度ではなく、デスクトップのサイズに依存しているようです。ただし、デスクトップは解像度に準拠しています。トリックは、デスクトップのサイズを変更するか、そこから開始することです。

少し前に、Robert Bresner (彼の Web サイト) という名前の開発者が、画面解像度を超えて Windows を拡張する sDesk (ここからダウンロード可能) という製品を作成しました。

Sデスクとは?SDesk はマルチデスクトップ プログラムではありません。モニターの可視領域を超えて広がる単一の巨大なデスクトップを作成するプログラムです。Windows デスクトップ設定で定義されているように、SDesk の一部のみが一度に表示されます。

SDesk ソフトウェアの元のホームページはここにアーカイブされています インターネット上に現在のページはありません (私が見つけることができました) が、このアーカイブされたバージョンは、インターネットの多くをキャッシュしているWay Back Machineを通じてアクセスされます。

SDesk 製品はフリーウェアです。ただし、ソースコードは含まれていません。彼の連絡先ページ (アーカイブ バージョンでも利用可能) にアクセスして、ソースが利用可能かどうか、または調査のために入手できるかどうかを尋ねることができます。

于 2010-01-05T22:01:53.520 に答える
1

複数の画面を接続できるビデオ カードを使用している場合、別の回避策として、2 つの画面を並べて使用しているかのようにシステムをセットアップします。次に、2 つの画面を合わせたサイズにウィンドウのサイズを変更できます。

于 2009-12-28T13:46:23.353 に答える
0

わかりました。キーストロークを使用してウィンドウを移動したり、サイズを変更したりしました。しかし、システムは自動的にウィンドウを私のXPのデスクトップの表示領域に戻します。SetWindowPos APIも試しましたが、役に立ちませんでした。最良のチャンスはビデオドライバーを書くことですが、それはもっと研究が必要かもしれません。360デスクトップは、デスクトップを水平方向に拡張できると主張しています。しかし実際には、現在のデスクトップを仮想のより広いスペースにパンするだけです。内部のウィンドウには、画面の解像度以下のサイズ制限があります。

ビデオドライバーは画面解像度を設定し(はい、lcd / crt画面機能と互換性がある必要があります)、Windowsはこのしきい値によってウィンドウサイズを制限しました。ユーザースペースAPIで回避したいだけです。

于 2009-01-16T00:18:46.677 に答える
-1

MSDN のより画面に適したビューが必要な特定のケース、または画面領域を十分に活用しない他のサイト (StackOverflow など) では、IE7Pro などのツールを使用して、ページにカスタム スタイルシートを適用することをお勧めします。 (IE)、Greasemonkey (Firefox)、Stylish (Fireox)、または Opera の組み込みスタイルシート ピッカー。

于 2009-01-15T07:45:11.877 に答える