タスクバーの非表示~Taskman Shell の組込み
2011/08/18 koga
前回 は、OS をカスタマイズせずに、レジストリ設定や API 呼び出しだけでタスクバーの非表示対応(アプリケーションのフルスクリーン表示対応)を行う方法について、説明しました。今回は、タスクバーを表示しないシェルを組み込む方法について説明します。
■Taskman Shell
WinCE 6.0(および WEC 7)には、タスクバーを表示しないカスタムシェルのソースコードが付属しており、WinCE 6.0 のリファレンスでも説明されています:
http://msdn.microsoft.com/en-US/library/ee502244(v=WinEmbedded.60).aspx (Including the Taskman Shell)
標準シェルを使用する必要がなく、専用のフルスクリーン表示アプリケーションを搭載するデバイスを開発する場合には、標準シェルの代わりに、この Taskman Shell を OS イメージに組み込むのが、簡単で良いのではないかと思います。
ただし、上のページに書かれている、Taskman Shell を組み込む方法は、実際には使えません。説明が間違っているように思われます。そこで、Taskman Shell を組み込むやり方について、以下に一例を述べます。
■Taskman Shell の組み込み
上記の、WinCE 6.0 のリファレンスページでは、Taskman Shell を OS イメージに組み込む場合、’__SYSGEN_TASKMAN’ という環境変数の値を 1 に設定すればよいと書かれています。しかし、その設定を行っても、Taskman Shell は OS イメージに組み込まれず、それどころか、Tasklman Shell のビルドすら行われません。WinCE のソースツリー配下のファイルを ‘__SYSGEN_TASKMAN’ で検索しても、この環境変数を参照している個所は見当たりませんし、さらに、Taskman Shell のソースコードの親ディレクトリ(%_WINCEROOT%/Public/Wceshellfe/Oak/)にある dir ファイルを見ると、Taskman Shell のディレクトリ(taskman)が記載されておらず、ビルド対象から外れていることが分かります。
では、どうすれば、OS Design をビルドした時に、Taskman Shell が OS イメージへ組み込まれるようになるのでしょうか?以下に、Taskman Shell を OS イメージへ組み込む手順の一例を述べます。
1.) taskman/ ディレクトリを、ビルド対象に含める。
VS 2005/Platform Builder の「ソリューションエクスプローラー」で、TASKMAN のアイコンを右クリックしてポップアップメニューを開き、[ビルドに含める] を選択します。TASKMAN は、ソリューションエクスプローラーで、次の階層にあります:
C:/WINCE600
PUBLIC
wceshellfe
OAK
TASKMAN ★
注:確認していませんが、この(1)(「ビルドに含める」)は、必要ないかも知れません。
2.) %_WINCEROOT%/PUBLIC/CEBASE/OAK/MISC/ にある wceshellfe.bat を編集して、次の行を追加する:
REM for Taskamn shell
if "%__NO_SYSGEN_TASKMAN%"=="1" goto noTaskmanShell
rem Turn off StandardShell
set __SYSGEN_EXPLORER=
rem add TaskmanShell to WCESHELL module
set WCESHELLFE_MODULES=%WCESHELLFE_MODULES% taskman
:noTaskmanShell
上の行を追加する位置は、wceshellfe.bat の440行付近にある、以下の行の直前にして下さい。
goto :EOF
:Not_Pass1
3.) OS Design をリビルドする。
上記の手順により、OS イメージ(nk.bin)に taskman.exe が追加され、さらに、レジストリの [HKEY_LOCAL_MACHINE\init] キーの Launch50 の値が "taskman.exe" になります。標準シェル(explorer.exe)は OS イメージには収録されず、標準シェルを Taskman Shell が置き換えられます。ここで、標準シェルが OS イメージに収録されないのは、上の (2) で wceshellfe.bat に追加した行の中の
set __SYSGEN_EXPLORER=
という行の働きによるものです。一方、Taskman Shell が OS イメージに収録されるのは、
set WCESHELLFE_MODULES=%WCESHELLFE_MODULES% taskman
という行の働きによるものです。この行の意味については、2011/08/14 に書いた「CESYSGEN 条件文での ‘Component’ 名」を併せ読んでみて下さい。この行の働きにより、taskman がビルドターゲットの依存ファイル/ターゲットの一部となり、ビルドされるようになるというわけです。さらに、 %_WINCEROOT%/Public/Wceshellfe/Oak/FILES/ にある wceshellfe.bib と wceshellfe.reg の中の taskman.exe に関する記述が、上の行の設定により有効になる、というわけです。以下に、wceshellfe.bib と wceshellfe.reg の当該個所を引用します:
wceshellfe.bib
; @CESYSGEN IF WCESHELLFE_MODULES_TASKMAN
taskman.exe $(_FLATRELEASEDIR)\taskman.exe NK SH
; @CESYSGEN ENDIF
wceshellfe.reg
; Choose only *one* of the taskman or explorer components in your cesysgen.bat
; @CESYSGEN IF WCESHELLFE_MODULES_TASKMAN
[HKEY_LOCAL_MACHINE\init]
"Launch50"="taskman.exe"
"Depend50"=hex:14,00, 1e,00
; @CESYSGEN ENDIF
Taskman Shell を OS イメージに収録せず、標準シェルに戻す場合は、%_WINCEROOT%/PUBLIC/CEBASE/OAK/MISC/wceshellfe.bat に追加した行を削って元に戻すか、または、'__NO_SYSGEN_TASKMAN' という環境変数の値を 1 に設定して OS Design をビルドして下さい(*)。
* 上述した例では、'__NO_SYSGEN_TASKMAN' という環境変数を設定しない場合、Taskman Shell が組み込まれます。つまり、デフォルトで Taskman Shell が組み込まれる設定になってしまいます。どちらかといえば、デフォルトでは標準シェルが組み込まれるように設定できるのが良いと思います。つまり、冒頭で述べた WinCE 6.0 のリファレンスページに書かれているように、'__SYSGEN_TASKMAN' という環境変数を 1 に設定した時にだけ、Taskman Shell が組み込まれるようにできる方が良いでしょう。しかし、試してみたところ、wceshellfe.bat に追加する行の中で '__SYSGEN_TASKMAN' という環境変数を参照して条件分岐するようにしても、期待通りに動作しませんでした。簡単に動きを追ってみたところ、Platform Builder の環境変数設定で __SYSGEN_TASKMAN の値を設定しても、wceshellfe.bat の当該個所が実行される時点で、__SYSGEN_TASKMAN の値が空になってしまっていることが原因でした。詳細は不明ですが、WinCE のビルドシステムにおいて、'__SYSGEN' という接頭辞の環境変数に対しては、ビルド処理を開始する前に、その値を空にする内部処理を実行しているのかも知れません。
おそらく、今回述べた手順例よりも、もっと良いやり方があるのではないかと思います。WinCE のビルドシステムに対し、ビルド内容をカスタマイズする「フック」の仕組みが提供されていますから、その仕組みを使うことで、もっとエレガントな対応ができるのかも知れません。興味のある方は、ご自分で調べて、追ってみて下さい。
Entry Filed under: OS のコンフィグレーション, 付属機能の使い方

1 Comment Add your own
1. 中山 | 9月 2nd, 2011 at 02:40
ども中山です。
うちでもTaskmanベースのカスタマイズシェルは良くやります(というかCE 2.12まではExplorerシェルが存在せず100%カスタムシェルでした…)
で、最近やるのはWINCE600\3rdParty 以下に用意してしまう方法です。カタログXMLファイルの”Location”を工夫して作ると、Explorerシェル/WBTシェル/カスタムシェル のように3者択一のような記述を行うことが出来ます。
true
#MS:Cebase:ShellandUserInt.lShell(Choose1):Location
とかそんな感じ。
Leave a Comment
Some HTML allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackback this post | Subscribe to the comments via RSS Feed