この文書では、Citrix環境で特定のマルチモニタ機能の制御に使用できる設定について説明します。たとえば、指定したアプリケーションやアプリケーションウィンドウの操作と表示を制御する設定や、ICAセッションの動作を制御する設定について説明します。
対象読者
アプリケーション開発者、Citrixサーバー管理者、ヘルプデスク担当者など
注:XenApp 6.0サーバーおよびOnline Plug-in 12.0を導入すると、以下の一覧のほぼすべてのレジストリフラグ設定が使用できなくなります。このリリースではCitrixマルチモニタに大幅な機能強化がされており、Citrixマルチモニタ設定を使用してCitrixマルチモニタICAセッションがネイティブなワークステーションウィンドウのように動作できるようになりました。詳しくは、『Citrixのサーバー側レジストリのでのマルチモニタ設定』を参照してください。
目次:
Citrix製品環境でのマルチモニタのサポート
Citrixのサーバー側マルチモニタ設定に関する前提事項
Citrixのサーバー側レジストリでのマルチモニタ設定
Citrixのクライアント側のマルチモニタ設定
Citrix製品環境でのマルチモニタのサポート
Citrix Presentation Server 4.5のHotfix Rollup Pack 1およびPresentation Server WindowsクライアントVersion 10.100では、マルチモニタサポート機能が強化されています。この強化されたマルチモニタサポート機能を使用するには、これらのソフトウェアが必要です。
以前のバージョンのCitrix Presentation ServerおよびPresentation Serverクライアントfor Windowsでも、限定的にマルチモニタがサポートされていました。Citrixでは、公開アプリケーションへの接続にマルチモニタ構成のワークステーションを使用することを予定している場合は、Citrix Presentation Server 4.5 Hotfix Rollup Pack 1以降にアップグレードすることをお勧めします。
Windows 2000およびWindows 2003のターミナルサービスセッションでは、RDPでもICAでもマルチモニタクライアントがサポートされていません。
ターミナルサービスセッションは、クライアントに接続されているすべてのモニタの画面サイズを合計して、それを1つの大きなモニタと見なします。
たとえば、解像度1024×768の2つのモニタがクライアントに接続されている場合、セッションの画面サイズは2048×768になります。
ここでは、マルチモニタの展開においてサーバー側に必要な重要な項目について説明しています。
セッションのグラフィックで使用するメモリ
マルチモニタ環境でICAセッションを使用する場合は、ICAセッションで必要となる各セッションのグラフィックで使用するメモリの量を計算することが重要です。これは各セッションでグラフィックデータ用に割り当てられるメモリの量で、Access管理コンソールでデフォルト値が5120バイトに、上限値が8192バイトに設定されています。仮想デスクトップでは、Access管理コンソールで割り当てたメモリ上限値よりセッションのグラフィックで使用するメモリの量が大きくなる場合があります。その場合は、Access管理コンソールでの設定に基づいて、自動的に表示色数または解像度が下げられます。
セッションのグラフィックで使用するメモリ量の計算式
X:ICAセッションウィンドウの幅
Y:ICAセッションウィンドウの高さ
Z:ICAセッションウィンドウの表示色数(1:8ビット、2:16ビット、3:24ビット)
M:セッションで必要となるグラフィックのメモリ量
M=X*Y*Z
例:1024×768×24ビットのセッションの場合、M = 1024*768*3 = 2,359,296バイト
ユーザーが頻繁に切断および再接続する環境での必要なグラフィックのメモリ量の計算
ユーザーが頻繁に切断および再接続する環境では、それを考慮してセッションの必要なグラフィックのメモリ量を計算する必要があります。再接続時には、サーバー側で切断セッション用に割り当てられたメモリを保持する必要があるため、通常の2倍のメモリが必要になります。したがって、たとえば前述の1024×768×24ビットのセッションの場合、再接続時に必要となるグラフィックのメモリ量は4,718,592バイトになります。
レジストリを編集してセッションに割り当て可能なグラフィックメモリ量を増やす方法
注:サーバー上で以下のパラメータの設定を調整すると、すべてのセッションでより多くのメモリを消費できるようになるため、サーバーのスケーラビリティに悪影響が生じることがあります。
以下の手順に従うと、ICAセッションのグラフィックで使用するメモリ量をAccess管理コンソールでの設定値より大きい値に設定することができます。この手順では、Presentation Serverサーバーのレジストリを編集します。この設定変更は、特定のサーバーでセッションのグラフィックメモリ量を8MB以上に増やす必要がある場合のみ行ってください。
注:レジストリエディタの使用を誤ると、深刻な問題が発生する可能性があり、Windowsの再インストールが必要になることがあります。レジストリエディタは自己の責任と判断の範囲でご使用ください。また、レジストリを編集する前に、レジストリファイルのバックアップを作成してください。
1. Access管理コンソールを起動し、設定対象の各サーバーのプロパティを編集します。[ICA]-[表示設定]の順に選択し、[サーバーファームの設定を使用する]チェックボックスをオフにします。このチェックボックスをオフにしなかった場合、IMAによって、レジストリに設定したThinWireのMaxLVBMemパラメータの値が、該当するサーバーファームの設定で上書きされます。
2. MaxLVBMemパラメータの値を、セッションの画面サイズと表示色数の最大値から計算します。
全モニタを合わせた領域の横方向のサイズをX、縦方向のサイズをY、色数のビット数の最大値をDとすると、MaxLVBMemは次の式で与えられます。
X * Y * D / 8
3. 必要に応じて、ローカルビデオバッファ(LVB)のメモリ要件に合わせて、WindowsのSessionPoolSizeパラメータの値を調整します。
MaxLVBMemは、システムに割り当てられているSessionPoolSizeの35~40%以内に抑えるのが理想的です。SessionPoolSizeの40%を超えるメモリが消費される場合は、システムレジストリでSessionPoolSizeパラメータの値を上げ、コンピュータを再起動します。
SessionPoolSizeパラメータは、システムレジストリのHKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥Session Manager¥Memory ManagementキーにあるSessionPoolSizeというDWORD値に設定されています。データはMB単位で表されています。Microsoftは、16MB単位でこの値を上げていくことを推奨しています。
32ビットシステムでのデフォルトのSessionPoolSizeは、16MBまたは32MBです。このどちらになるかはコンピュータの搭載メモリ容量によって異なり、x64システムでのデフォルトのSessionPoolSizeは64 MBです。
この設定変更を反映させるには、コンピュータを再起動する必要があります。
4. regeditを起動し、次のレジストリキーを開きます。
HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥Terminal Server¥Wds¥icawd¥thin16.
5. MaxLVBMemというレジストリ値のデータを、手順1.で計算した値に増やします。
仮想ICAセッションのデスクトップサイズの計算方法
グラフィック座標の原点は、ICA仮想デスクトップの左上隅に置かれます。Xを横軸、Yを縦軸とした場合、この点がX=0、Y=0と見なされます。グラフィック座標上の位置は、(0, 0)から右方向および下方向に数えた正のピクセル数をXとYに加えることで計算されます。したがって、たとえば解像度1024×768 モニタの場合、右下隅の座標はX=1024、Y=768になります。
ICAマルチモニタ仮想デスクチップは、最も左側にあるモニタの左上隅ではなく、矩形領域全体に基づいて設定されます。したがって、仮想デスクトップの領域がクライアントのモニタが占める領域より大きくなる場合があります。たとえば、以下のモニタ構成の場合、仮想デスクトップの左上隅は3つのモニタを含む矩形領域の左上隅になります。仮想デスクトップ内のモニタが存在しない領域もアドレス指定することができますが、その領域は表示されず、以下の図にはグレーで示されています。ICAセッションのサイズと表示位置を計算するときには、このグレー領域のサイズを計算に含めるとともに、ICAセッションウィンドウがこのグレー領域の外に表示されるようにする必要があります。
モニタ一覧の取得
Windows:Windowsでは、コンピュータ上のモニタが、左から右、上から下へと取得されます。最初のモニタにはゼロ(0)が割り当てられ、順次1、2 ...と番号が割り当てられます。
ICAセッション:ICAセッション内で取得されるモニタ一覧は、セッションウィンドウが表示されているモニタに特定されるので注意してください。たとえば、セッションウィンドウが上の例のMonitor 0とMonitor 2に表示されている場合、取得されるモニタ一覧では、Windows Monitor 0がSession Monitor 0に、Windows Monitor 2がSession Monitor 1になります。一方、セッションウィンドウがMonitor 1とMonitor 2に表示されている場合は、Windows Monitor 1がSession Monitor 0に、Windows Monitor 2がSession Monitor 1になります。
4台のモニタからなるマルチモニタ環境の例:
以下の例は、4台のモニタからなるマルチモニタ環境で、座標の計算とWindowsのモニタ一覧の取得処理がどのように行われるかを示しています。この例では、各クライアントモニタの解像度が1024×768に設定されています。仮想デスクトップ内にはどのモニタにも占有されていないグレー領域があります。また、この図にはモニタの各コーナーの座標が示されています。これらの座標を使って、画面上のリソースを利用できるようにICAセッションウィンドウのサイズと表示位置を計算することができます。
Monitor 0には、(0, 0)~(1023, 767)の範囲のピクセルが含まれています。「1023, 767」の各座標の値は、モニタの解像度での値より1小さくなっていることに注意します。
マルチモニタ設定は、レジストリ値を設定することによって行います。
**注:以下のレジストリフラグは、XenApp 4.5またはXenApp 5.0にのみ適用してください。
XenApp 6.0以降のバージョンで設定できるフラグは、「LAUNCHONMONITORHOOK」のみです。
32ビットサーバーでは、次のレジストリキーを使用します。
HKLM¥Software¥Citrix¥CtxHook¥AppInit_dlls¥Multiple Monitor Hook
64ビットサーバーでは、次のレジストリキーを使用します。
HKLM¥Software¥Wow6432Node¥Citrix¥CtxHook¥AppInit_dlls¥Multiple Monitor Hook
DefaultHooksというDWORD型レジストリ値のデータを変更すると、サーバー上のすべてのアプリケーションで使用される一連のフックが変更されます。
問題のある特定のアプリケーションで優先的に使用する設定を指定するには、[ImageName]というDWORD値を設定します。このようにすると、そのアプリケーションでサーバーのデフォルト設定が無効になります。
注:Citrix Presentation Server 4.0でこのDWORD値を設定する場合は、角かっこ[ ]でイメージ名を囲みます。Citrix Presentation Server 4.5では、角かっこ[ ]でイメージ名を囲む必要はありません。
DWORD値の計算
以下の図に、各フックに割り当てられている値を示します。
「**」が示されているフックは、デフォルトで有効になっています。
「+」が示されているフックは、Hotfix Rollup Pack 2 for Presentation Server 4.5以降の製品では、デフォルトで有効になっています。
フラグ名 |
10進値 |
16進値 |
用途 |
**COLORADOHOOKS |
1 |
0x1 |
このフックは、トップレベルウィンドウの適切な最大化/最小化およびクリッピング処理を行います。アプリケーションに対してフックを無効にする場合以外は、有効に設定します。 |
**SYSTEMMETRICSHOOK |
2 |
0x2 |
このフックは、セッション内でクライアントのモニタ数(SM_CMONITORS)を報告します。アプリケーションに対してフックを無効にする場合以外は、有効に設定します。詳しくは、http://msdn2.microsoft.com/en-us/library/ms724385.aspxを参照してください。 |
**GETMONFROMWINDOWHOOK |
4 |
0x4 |
このフックを設定すると、MonitorFromWindow APIが正常に機能するようになります。アプリケーションはこのAPIを使って、ウィンドウがどのモニタに表示されているかを判断します。詳しくは、http://msdn2.microsoft.com/en-us/library/ms534601.aspxを参照してください。 |
**GETMONFROMRECTHOOK |
8 |
0x8 |
このフックを設定すると、MonitorFromRect APIが正常に機能するようになります。アプリケーションはこのAPIを使って、指定した矩形領域(例:あるウィンドウの矩形領域)がどのモニタ上に存在するかを判断します。詳しくは、http://msdn2.microsoft.com/en-us/library/ms534605.aspxを参照してください。 |
**GETMONFROMPOINTHOOK |
16 |
0x10 |
このフックを設定すると、MonitorFromPoint APIが正常に機能するようになります。アプリケーションはこのAPIを使って、指定した点(例:ウィンドウの座標)がどのモニタ上に存在するかを判断します。詳しくは、http://msdn2.microsoft.com/en-us/library/ms534603.aspxを参照してください。 |
**GETMONINFOHOOK |
32 |
0x20 |
このフックを設定すると、GetMonitorInfo APIから適切な情報を含むMONITORINFO構造体が返されます。アプリケーションは通常このAPIをモニタ一覧の取得時に使用し、返されたデータに従ってトップレベルウィンドウを適切に配置します。詳しくは、http://msdn2.microsoft.com/en-us/library/ms534599.aspxを参照してください。 |
**ENUMDISPMONHOOK |
64 |
0x40 |
このフックを設定すると、EnumDisplayMonitors APIで正しいクライアントモニタ数が取得されるようになります。このフックは、通常GETMONINFOHOOK(上記参照)と共に使用します。モニタ一覧を取得するアプリケーションでは、このフックを有効にする必要があります(たとえばプレゼンテーションモードのPowerPointでは、プレゼンテーションの表示先モニタを選択できます)。詳しくは、http://msdn2.microsoft.com/en-us/library/ms534809.aspxを参照してください。 |
+ ENUMDISPDEVHOOK |
128 |
0x80 |
このフックを設定すると、EnumDisplayDevices APIで正しいクライアントモニタ(デバイス)数が取得されるようになります。DISPLAY_DEVICE構造体に、クライアントモニタの情報が格納されます。一部のアプリケーションは、このAPIを使ってデバイス固有の情報(デバイス名など)を取得します。詳しくは、http://msdn2.microsoft.com/en-us/library/ms533226.aspxを参照してください。 |
+ ENUMDISPSETHOOK |
256 |
0x100 |
このフックを設定すると、EnumDisplaySettings APIで各モニタのグラフィックモード情報が取得されるようになります。DEV_MODE構造体の一部に、グラフィックモード情報が格納されます。一部のアプリケーションはこのAPIを使って、特定のグラフィックモードに関する情報を取得します。アプリケーションで描画関連の問題(例:サイズ変更時にクライアント領域が正常に描画されないなど)が発生する場合は、このフックを有効にしてみます。詳しくは、http://msdn2.microsoft.com/en-us/library/ms533265.aspxを参照してください。 |
**CREATEDCHOOK |
512 |
0x200 |
このフックを設定すると、CreateDC APIで、個々のクライアントモニタ(ディスプレイ)ではなくプライマリディスプレイに関連付けられるデバイスコンテキストが作成されるようになります。アプリケーションはこのAPIを使って、必要な形式での特定のモニタへの描画を許可します(例:同じコンピュータ上のモニタ間でピクセル形式が異なっている場合など)。しかし、セッションでは実際には単一のディスプレイが使用されるので、このフックは、プライマリディスプレイデバイスに関連付けられるデバイスコンテキストを強制的に作成するために使用されます。アプリケーションで描画関連の問題が発生する場合は、このフックを使用します。詳しくは、http://msdn2.microsoft.com/en-us/library/ms533246.aspxを参照してください。 |
**CBTDIALOGHOOK |
1024 |
0x400 |
このフックは、アプリケーションに対してフックを無効にする場合以外は、有効に設定します。子ダイアログボックス(例:メッセージボックス)の適切な配置やセンタリングします。 |
LAUNCHONMONITORHOOK |
2048 |
0x800 |
このフックは、起動時に特定のモニタにアプリケーションを配置することを試みます。有効にする場合は、デフォルトのモニタをPreferredLaunchMonitorというICAパラメータに指定できます。このパラメータには、0~(n-1)の値を指定します(nはクライアントのモニタ数)。モニタ一覧は、上から左、下から右という順番で取得されます。現時点では、Coloradoサーバー側のDefaultLaunchMonitorレジストリ値は無効になっています。 |
**WINDOWLONGHOOKS |
4096 |
0x1000 |
このフックは、アプリケーションに対してフックを無効にする場合以外は、有効に設定します。ウィンドウを動的にサブクラス化するアプリケーションを検出し、MMHookのCOLORADOHOOKSを適用します。 詳しくは、http://msdn2.microsoft.com/en-us/library/ms633584.aspx、 http://msdn2.microsoft.com/en-us/library/ms633585.aspx、 http://msdn2.microsoft.com/en-us/library/ms633591.aspx、 およびhttp://msdn2.microsoft.com/en-us/library/ms644898.aspxを参照してください。 |
IGNORE_WS_MAXIMIZE_BOX |
8192 |
0x2000 |
ウィンドウを(COLORADOHOOKSを適用して)サブクラス化する前に、MMHookはウィンドウスタイルを調べて最大化ボタンの存在を確認します。これは、ウィンドウの最大化機能のマーカーとして、また、MMHookによって不要にウィンドウがサブクラス化されないようにするために使用されます。ウィンドウが(たとえばタスクバーから)最大化可能な状態になっているが、最大化ボタンを持っていない場合は、このフラグを設定すると、このチェック処理を無効にできます。 |
**SUBCLASS_OWNED_WINDOWS |
16384 |
0x4000 |
MMHookは、親ウィンドウを持たないウィンドウをトップレベルウィンドウとして認識します。しかし、一部のアプリケーションでは、メインウィンドウが親ウィンドウを持っている場合があります。アプリケーションのウィンドウが最大化時に複数のモニタにまたがって表示される場合は、そのウィンドウが親ウィンドウを持っている可能性があります。その場合は、このフラグを有効にします。 |
SYSTEMPARAMETERSINFOHOOK |
32768 |
0x8000 |
プライマリモニタの作業領域の取得に使用します。詳しくは、http://msdn2.microsoft.com/en-us/library/ms724947.aspx(SPI_GETWORKAREA)を参照してください。 |
FORCEMAXIMIZETOMONITOR |
65536 |
0x10000 |
WM_GETMINMAXINFOメッセージ(http://msdn2.microsoft.com/en-us/library/ms632626.aspxを参照)をインターセプトするアプリケーションは、ウィンドウの最大化先となる領域を制限することができます。この動作を変更するには、このフラグを設定します。 |
デフォルトの動作を変更するには、有効にするフックを選択してそれらをまとめて追加します。値を設定するときには、10進モードで入力するか、16進数に変換してから16進モードで入力します。
値をゼロ(0)に設定すると、MMHookを無効にしたことと同じになります。これは、前述の説明のようにすべてのプロセス、またはアプリケーションごとに行うことができます。
重要:winlogon.exeのみを無効にしないでください。winlogon.exeのみを無効にすると、存在しないマップトファイルがすべてのプロセスで検索されるため、パフォーマンスが低下する可能性があります。
INIファイルとICAファイルのパラメータ
Presentation Serverの新しいバージョンでは、ICAセッション内で作成されるアプリケーションウィンドウに関する機能強化が施されています。以下の設定を使用する前に、Citrix Presentation Server 4.5 Hotfix Rollup Pack 01以降でアプリケーションの動作をテストしてください。
以下では、ICAセッションウィンドウの設定に使用できるパラメータの詳細を説明します。これらのパラメータは、保存済みのICAファイルまたはINIファイルに適用できます。
注:これらのパラメータを使用するには、ICAファイルまたはINIファイルでパラメータDesiredWinType=16を設定する必要があります。
位置パラメータ:DesiredVPOSとDesiredHPOS
DesiredVPOSには、ICAセッションウィンドウ左上隅の縦座標を指定します。
注:座標は、仮想デスクトップの左上隅(0, 0)から下方向に数えられます。
DesiredHPosには、ICAセッションウィンドウ左上隅の横座標を指定します。
注:座標は、仮想デスクトップの左上隅(0, 0)から右方向に数えられます。
解像度パラメータ:DesiredVRESとDesiredHRES
DesiredVRESには、ICAセッションウィンドウの高さを、DesiredVPOSの位置から下方向に数えたピクセル数で指定します。
DesiredHRESには、ICAセッションウィンドウの幅を、DesiredHPOSの位置から右方向に数えたピクセル数で指定します。
使用例:
[Desktop 2]
DesiredWinType=16
DesiredHPos=2048
DesiredVPos=0
DesiredHRES=1024
DesiredVRES=1536
上図の4台のモニタからなる環境でこの設定を使用すると、Monitor 0(右上のモニタ)の左上隅にICAセッションウィンドウが表示されます。ICAセッションウィンドウの幅は1024 、高さは1536 (1024×1536)となり、Windows Monitor 0とMintor 3にわたって表示されます。
優先モニタパラメータ:PreferredLaunchMonitor
このパラメータは、問題のあるアプリケーションでのみ使用することをお勧めします。
PreferredLaunchMonitorには、ICAセッション内で起動したアプリケーションを、どのセッションモニタで起動するか、を指定します。
注:このパラメータには、セッションのモニタではなく、ICAセッション内で起動したアプリケーションのモニタを指定します。
これは、[Desktop2]ICAセッションで取得されるモニタ一覧とは異なります。取得されるモニタ一覧には、使用されている2つのモニタ(Windows Monitor 0とWindows Monitor 2)だけが含まれており、それらがそれぞれSession Monitor 0とSession Monitor 1になります。PreferredLaunchMonitorパラメータでは、セッションモニタ番号を使用します。
[Desktop 2]
DesiredWinType=16
DesiredHPos=2048
DesiredVPos=0
DesiredHRES=1024
DesiredVRES=1536
PreferredLaunchMonitor=1
この例では、[Desktop 2]ICAセッションウィンドウ内で起動されたアプリケーションが、Windows Monitor 2(Session Monitor 1)上で起動します。
最大化表示パラメータ:DefaultMaximizedPos
DefaultMaximizedPosパラメータには、ICAセッションウィンドウのサイズ変更後や最小化後にウィンドウを最大化表示に戻す場合のウィンドウ位置とウィンドウサイズを指定します。
使用例:以下のように設定した場合、ICAセッションウィンドウのサイズ変更後や最小化後にウィンドウを最大化すると、常に元のサイズに戻ります。
注:必要に応じて、別の位置や別のウィンドウサイズを指定できます。
DefaultMaximizedPos={2048,0,1024,1536}
新しいショートカットキー割り当て
Presentation Serverクライアントfor Windows Version 10.100では、以下のショートカットキー割り当てが追加されました。
Shift + F2キー:全画面モードと通常表示モード間の切り替え
Shift + F2ショートカットキーを押すと、ICAセッションウィンドウが全画面モードと通常表示モードの間で切り替わります。
使用方法:ICAセッション内でShift + F2キーを押すと、ICAセッションが通常表示モードに切り替わります。もう一度Shift + F2キーを押すと、ICAセッションが全画面モードに戻ります。
Shift + F11キー:全画面モードのICAセッションウィンドウの最小化
Shift + F11ショートカットキーを押すと、全画面モードのICAセッションが最小化されます。
注:この動作は、Presentation Serverクライアントバージョン10.214、10.223、10.225、10.230、11.00およびそれ以降では以前の状態に戻っており、デフォルト設定の状態でShift+F11を押してもICAセッションは最小化されません。しかしキーシークエンスはセッションへ送信されます。
Shift + F12キー:全画面モードのICAセッションウィンドウのリストア(元のサイズに戻す)
Shift + F12ショートカットキーを押すと、最小化状態またはサイズ変更後のICAセッションウィンドウを、割り当てられている元のサイズに戻します。