![]() |
| home> | software> |
| ドライブリストの取得とドライブの種類の判別 |
| マイコンピュータ内のドライブ一覧の取得方法とドライブの種類の判別方法。 リムーバブルドライブ、HDD、ネットワークドライブ、RAMドライブ、CDドライブは判別できるのですが、MOとFDDはどちらもリムーバブルなんだろか |
ドライブリストの取得
String drives[] = com.ms.wfc.io.File.getLogicalDrives();
ドライブの種類の判別
int driveType = com.ms.win32.Kernel32.GetDriveType(driveName);
switch(driveType){
case com.ms.win32.win.DRIVE_REMOVABLE:
// FDD、MOなど
case com.ms.win32.win.DRIVE_FIXED:
// HDD
case com.ms.win32.win.DRIVE_REMOTE:
// ネットワークドライブ
case com.ms.win32.win.DRIVE_CDROM:
// CDドライブ
case com.ms.win32.win.DRIVE_RAMDISK:
// RAMディスク
}
|
| 特殊なフォルダのパスを得る |
|
デスクトップフォルダ等の特殊なフォルダのパスを得る方法。 |
特殊なフォルダのパスは com.ms.wfc.app.SystemInformationクラスのスタティックメソッド getSpecialFolderPathで得ることができます。 メソッドの引数にはcom.ms.wfc.app.SpecialFolderで定義されているフィールドを指定します。 (例)現在のユーザーのデスクトップフォルダを得る String desktop = SystemInformation.getSpecialFolderPath(SpecialFolder.DESKTOP_DIRECTORY); |
| フォルダの中をすべて削除する。 |
|
指定したフォルダに含まれるファイルとフォルダを全て削除する。
フォルダは再起的に階層を下って全てのフォルダが削除されます。 この例では「フォルダに含まれるファイルを列挙する」「フォルダのアトリビュートを得る」 「ファイルの削除」「フォルダの削除」の方法が含まれています。 |
import com.ms.wfc.io.*; /** * 指定フォルダの中のファイルをすべて削除(指定したフォルダは残る) * @param path 中身を削除したいフォルダのパス * @return true:成功 |
| ファイルの更新日付の取得 |
|
ファイルの更新日付はGetFileTimeで取れるのですが取得した値は 普通のシステムデート等とは違う(起点が違う?)ので そのままではjava.util.Dateやcom.ms.wfc.app.Timeにすることができません。 でも、ちゃんとTime.fromFileTimeなるメソッドが用意されているので 下のように変換してやればOK |
import com.ms.wfc.app.Time;
import com.ms.wfc.io.File;
import com.ms.wfc.io.FileMode;
import com.ms.win32.FILETIME;
import com.ms.win32.Kernel32.GetFileTime;
public Time getFileTime(String fileName){
Time tm = null;
try{
File targetFile = new File(fileName,FileMode.OPEN);
FILETIME lastUpdate = new FILETIME();
if (GetFileTime(targetFile.getHandle(),null,null,lastUpdate)){
tm = Time.fromFileTime(lastUpdate.getTimeLong());
}
targetFile.close();
}catch(Exception ex{}
return tm;
}
|
| ドライブリストの取得とドライブの種類の判別 |
| マイコンピュータ内のドライブ一覧の取得方法とドライブの種類の判別方法。 リムーバブルドライブ、HDD、ネットワークドライブ、RAMドライブ、CDドライブは判別できるのですが、MOとFDDはどちらもリムーバブルなんだろか |
ドライブリストの取得
String drives[] = com.ms.wfc.io.File.getLogicalDrives();
ドライブの種類の判別
int driveType = com.ms.win32.Kernel32.GetDriveType(driveName);
switch(driveType){
case com.ms.win32.win.DRIVE_REMOVABLE:
// FDD、MOなど
case com.ms.win32.win.DRIVE_FIXED:
// HDD
case com.ms.win32.win.DRIVE_REMOTE:
// ネットワークドライブ
case com.ms.win32.win.DRIVE_CDROM:
// CDドライブ
case com.ms.win32.win.DRIVE_RAMDISK:
// RAMディスク
}
|
| クリップボードの利用 |
| クリップボードを利用してコピー、貼り付けする方法。 この例ではデータ形式はテキストまたはBitmapの2種類に対応 |
コピー
public void copyClipboard(Object data){
DataObject data = new DataObject();
if (data.getClass() == String.class){
data.setData(DataFormats.CF_TEXT,data);
}
else if (data.getClass() == Bitmap.class){
data.setData(DataFormats.CF_BITMAP,data);
}
Clipboard.setDataObject(data,true);
}
貼り付け
public void pasteClipboard(){
IDataObject idata = Clipboard.getDataObject();
if (idata.getDataPresent(Bitmap.class)){
Bitmap img = (Bitmap)idata.getData(Bitmap.class);
}
else if (idata.getDataPresent(String.class)){
String text = (String)idata.getData(String.class);
}
//以下に貼り付け処理を記述
}
|
| プロセスの起動 |
| アプリケーションから別のプロセスを起動する。この方法の場合EXEファイル以外でも「開く」の動作をします。たとえばHTMLの場合IEが起動したり。。。 |
/**
* @param app 起動するアプリケーション
* @param size コントロールのサイズ
* @return 起動結果
*/
public boolean lunchApp(String app, String param){
int rc = com.ms.win32.Shell32.ShellExecute(
0,"open",target,pm,".",com.ms.win32.win.SW_SHOWDEFAULT);
return (rc != 2);
}
|
| レジストリの操作 |
| レジストリにキーや値を作成したり、値の取得・変更の方法 |
//キーの作成
RegistryKey key = Registry.LOCAL_MACHINE.createSubKey("Software\\SUSI soft");
//値のセット
key.setValue("homepage", "http://www.k-nextage.co.jp/ame/");
//操作が終わったらクローズ
key.close();
//キーの取得
RegistryKey key = Registry.LOCAL_MACHINE.getSubKey("SOFTWARE\\SUSI soft");
//値の取得
String homePage = key.getValue("homepage");
//操作が終わったらクローズ
key.close();
|
| 画面のキャプチャ |
| Form(またはForm内のコントロール)のキャプチャを取ってBitmapオブジェクトにします。 |
/**
* @param hwnd コントロールのハンドル
* @param size コントロールのサイズ
* @return Bitmap
*/
public Bitmap getCapture(int hwnd, Point size){
int srcDC = Windows.GetDC(hwnd);
Bitmap bmp = new Bitmap(size.x, size.y);
int hDC = bmp.getGraphics().getHandle();
com.ms.wfc.win32.Windows.BitBlt(
hDC,0,0,w,h,srcDC,0,0,com.ms.wfc.win32.Windows.SRCCOPY);
return bmp;
}
// 下の方法でも取れます。
public Bitmap getCapture2(int hwnd, Point size){
Bitmap bmp = new Bitmap(size.x, size.y);
int hDC = bmp.getGraphics().getHandle();
com.ms.win32.User32.SendMessage(
hWnd,com.ms.win32.winw.WM_PRINT,hDC,
com.ms.win32.winp.PRF_CLIENT | com.ms.win32.winp.PRF_ERASEBKGND);
return bmp;
}
|
| WAVの再生 |
| WAVの再生はラッパークラスが用意されています |
com.ms.win32.Winmm.sndPlaySound(String p1, int p2) p1にはWAVファイル名 p2には再生フラグ 再生フラグは com.ms.win32.winの中で SND_ASYNC 非同期再生 SND_LOOP 繰り返し再生 SND_SYNC 同期再生 その他いろいろ(SND_で始まる)定義されてます。 |
| 2重起動のチェック |
| アプリケーションの2重起動をチェックする方法はいろいろ(ミューテックスを使うのが一般的?)あると思いますが、簡単にチェックする方法としてタイトルバーの文字を検索してWindowの存在からチェックする方法を紹介 |
/**
* @param titleBarText タイトルバーのテキスト
* @return 検索結果
*/
public boolean checkAppWindowExist(String titleBarText){
int hwnd = com.ms.win32.User32.FindWindow(null,titleBarText);
if (hwnd != 0){
return true;
}
return false;
}
|
| アプリケーション同士の通信 |
| これまたいろいろ方法はありますが、相手のハンドルを使ってCOPYDATAメッセージを送る方法です。 この例ではintしか渡せませんが工夫すればObjectも渡せます。 |
メッセージを送る側
/**
* @param hwnd 受け取り側のハンドル
* @param sendData 送るデータ
*/
public void sendMessage(int hwnd, int sendData){
com.ms.win32.COPYDATASTRUCT cpdata = new com.ms.win32.COPYDATASTRUCT();
cpdata.dwData = hwnd;
cpdata.lpData = msg;
com.ms.win32.User32.SendMessage(hwnd,com.ms.win32.win.WM_COPYDATA,hwnd,cpdata);
}
メッセージを受ける側
wndProcメソッドをオーバーライドします。
public void wndProc(Message msg){
if (msg.msg != com.ms.win32.win.WM_COPYDATA){
super.wndProc(msg);
return;
}
int sendData = msg.lParam;
//受け取ったデータの処理を以下に記述
}
|
| フォルダ選択ダイアログ |
| WFCにはフォルダ選択ダイアログが用意されていないのでJ/Directで作成。 |
public class Win32
{
/**
* フォルダの参照ダイアログ
* @param hwnd 親のHandle
* @param comment 説明文
* @return 選択したフォルダ
* キャンセル:null、無効なフォルダを選択:""(長さ0)
*/
public static String FolderSelectDialog(int hwnd,String comment){
BROWSEINFO bi = new BROWSEINFO();
bi.hwndOwner = hwnd;
bi.pidlRoot = 0;
bi.pszDisplayName = new String(new byte[32768]);
bi.lpszTitle = comment;
String select = null;
while(true){
int result = SHBrowseForFolder(bi);
if (result == 0) break;
int pidl = result;
char bSelPath[] = new char[32768];
result = SHGetPathFromIDList(pidl,bSelPath);
select = new String(bSelPath);
if (select.length() > 0) break;
com.ms.wfc.ui.MessageBox.show("選択したフォルダは無効です。",
"エラー",
com.ms.wfc.ui.MessageBox.ICONERROR);
}
return select;
}
/**
* @dll.struct(auto)
*/
private static class BROWSEINFO
{
public int hwndOwner;
public int pidlRoot;
public String pszDisplayName;
public String lpszTitle;
public int ulFlags;
public int lpfn;
public int lParam;
public int iImage;
}
/**
* @dll.import("SHELL32",auto)
*/
private static native int SHBrowseForFolder(BROWSEINFO lpbi);
/**
* @dll.import("SHELL32",auto)
*/
private static native int SHGetPathFromIDList(int pidl,char[] pszPath);
}
|
| ネットワークリソースの取得 |
| ネットワークリソースに関しては全くクラスが用意されていないのでJ/Directで作成。 ただかなり怪しい実装です(まだバグがありそう) 使い方は getNetResourceメソッドを最初は引数nullで呼び出すとネットワークコンピュータの一番上の階層 に含まれる NETRESOURCEオブジェクトのリストが帰ります。あとはそのNETRESOURCEを使用してそれぞれに含まれるリソースを階層を降りながら取得していけます。 最初から目的のリソースが特定できている場合はNETRESOURCEオブジェクトのメンバーに値をセットしてgetNetResourceメソッドを呼び出します。 |
import com.ms.wfc.util.List;
import com.ms.dll.DllLib;
/**
* Network Resources.
*/
// Scope
public static final int RESOURCE_CONNECTED = 0x00000001;
public static final int RESOURCE_GLOBALNET = 0x00000002;
public static final int RESOURCE_REMEMBERED = 0x00000003;
public static final int RESOURCE_RECENT = 0x00000004;
public static final int RESOURCE_CONTEXT = 0x00000005;
// Type
public static final int RESOURCETYPE_ANY = 0x00000000;
public static final int RESOURCETYPE_DISK = 0x00000001;
public static final int RESOURCETYPE_PRINT = 0x00000002;
public static final int RESOURCETYPE_RESERVED = 0x00000008;
public static final int RESOURCETYPE_UNKNOWN = 0xFFFFFFFF;
// Usage(用途)
public static final int RESOURCEUSAGE_CONNECTABLE = 0x00000001;
public static final int RESOURCEUSAGE_CONTAINER = 0x00000002;
public static final int RESOURCEUSAGE_NOLOCALDEVICE = 0x00000004;
public static final int RESOURCEUSAGE_SIBLING = 0x00000008;
public static final int RESOURCEUSAGE_ATTACHED = 0x00000010;
public static final int RESOURCEUSAGE_ALL = (
RESOURCEUSAGE_CONNECTABLE |
RESOURCEUSAGE_CONTAINER |
RESOURCEUSAGE_ATTACHED);
public static final int RESOURCEUSAGE_RESERVED = 0x80000000;
// DsiplayType
public static final int RESOURCEDISPLAYTYPE_GENERIC = 0x00000000;
public static final int RESOURCEDISPLAYTYPE_DOMAIN = 0x00000001;
public static final int RESOURCEDISPLAYTYPE_SERVER = 0x00000002;
public static final int RESOURCEDISPLAYTYPE_SHARE = 0x00000003;
public static final int RESOURCEDISPLAYTYPE_FILE = 0x00000004;
public static final int RESOURCEDISPLAYTYPE_GROUP = 0x00000005;
public static final int RESOURCEDISPLAYTYPE_NETWORK = 0x00000006;
public static final int RESOURCEDISPLAYTYPE_ROOT = 0x00000007;
public static final int RESOURCEDISPLAYTYPE_SHAREADMIN = 0x00000008;
public static final int RESOURCEDISPLAYTYPE_DIRECTORY = 0x00000009;
public static final int RESOURCEDISPLAYTYPE_TREE = 0x0000000A;
public static final int RESOURCEDISPLAYTYPE_NDSCONTAINER = 0x0000000B;
//ネットワークリソースの取得結果(もう無い)
public static final int ERROR_NO_MORE_ITEMS = 0x103;
/**
* ネットワークリソースの取得
* @return NETRESOURCEを格納したList
*/
public static com.ms.wfc.util.List getNetResource(NETRESOURCE target){
List res = new List();
if (target.lpProvider == null){
target = null;
}
try{
int enum[] = new int[]{0};
int usage = RESOURCEUSAGE_CONTAINER;
int rtype = RESOURCETYPE_ANY;
if (target != null){
if (target.bwDisplayType == RESOURCEDISPLAYTYPE_SERVER){
usage = RESOURCEUSAGE_ALL;
rtype = RESOURCETYPE_DISK;
}
}
int result = WNetOpenEnum(RESOURCE_GLOBALNET,rtype,usage,target,enum);
if (result != 0){
// WNetOpenEnum Error
return res;
}
int count[] = {1};
int size[] = {16384};
int rc[][] = new int[1000][8];
int memptr = DllLib.allocCoTaskMem(4 * 8 * 1000);
int rcidx = 0;
while((result = WNetEnumResource(enum[0],count,memptr,size)) == 0){
DllLib.copy(memptr,rc[0],0,8);
NETRESOURCE rctmp = new NETRESOURCE();
rctmp.bwScope = rc[0][0];
rctmp.bwType = rc[0][1];
rctmp.bwDisplayType = rc[0][2];
rctmp.bwUsage = rc[0][3];
rctmp.lpLocalName = (String)DllLib.ptrToString(rc[0][4]);
rctmp.lpRemoteName = (String)DllLib.ptrToString(rc[0][5]);
rctmp.lpComment = (String)DllLib.ptrToString(rc[0][6]);
rctmp.lpProvider = (String)DllLib.ptrToString(rc[0][7]);
res.addItem(rctmp);
rcidx++;
}
if (result != 259){//Enum終了以外の場合(エラー)
//WNetEnumResource error
}
DllLib.freeCoTaskMem(memptr);
WNetCloseEnum(enum[0]);
}catch(Exception ex){
//まだなんか例外が出る可能性あり(^^)
}
return res;
}
/**
* @dll.struct(auto)
*/
public static class NETRESOURCE
{
public int bwScope;
public int bwType;
public int bwDisplayType;
public int bwUsage;
public String lpLocalName;
public String lpRemoteName;
public String lpComment;
public String lpProvider;
public byte dummy;
}
/**
* @dll.import("MPR",auto)
*/
public static native int WNetOpenEnum(int scope,
int type,
int usage,
NETRESOURCE rc,
int enum[]);
/**
* @dll.import("MPR",auto)
*/
public static native int WNetEnumResource(int hEnum,
int lpcCount[],
int rc,
int size[]);
/**
* @dll.import("MPR",auto)
*/
public static native int WNetCloseEnum(int hEnum);
|
| FORMにWebBrowserコントロールを貼り付ける |
FORMにWebBrowserコントロールを貼り付ける方法としては調べた限りでは3つの方法がありました。
|
| URLを指定してWEBページを読み込む |
| URLをあらわすStringを引数で受け取ってWebBrowserコントロールで表示させるメソッド例 |
import com.ms.com.Variant;
import com.ms.com.SafeArray;
WebBrowser mosaic;
単純にGETで表示するメソッド
public void showPageByGet(String url){
try{
mosaic.Navigate(url,null,null,null,null);
}catch(Exception ex){}
}
POSTでデータも送るメソッド
public void showPageByPost(String url,String postData){
byte posts[] = postData.getBytes();
SafeArray sa = new SafeArray(Variant.VariantByte,posts.length);
sa.fromByteArray(posts);
Variant vpd = new Variant(sa,true);
Variant vhd = new Variant("Content-Type: application/x-www-form-urlencoded\n");
try{
mosaic.Navigate(url,null,null,vpd,vhd);
}catch(Exception ex){}
}
|
| 「戻る」「進む」「ホーム」「中止」「更新」ボタン押下処理 |
| 「戻る」「進む」「ホーム」「中止」「更新」の実装例 |
WebBrowser mosaic;
戻る
public void backPage(){
try{
mosaic.GoBack();
}catch(Exception ex){}
}
進む
public void forwardPage(){
try{
mosaic.GoForward();
}catch(Exception ex){}
}
ホーム
public void homePage(){
try{
mosaic.GoHome();
}catch(Exception ex){}
}
中止
public void stopPage(){
try{
mosaic.Stop();
}catch(Exception ex){}
}
更新
public void reloadPage(){
try{
mosaic.Refresh();
}catch(Exception ex){}
}
更新(更新レベルを指定)
0:普通の更新(cache使用)
1:ページが期限切れの場合更新
3:no cache 更新
public void reloadPage(int level){
try{
mosaic.Refresh2(new com.ms.com.Variant(level));
}catch(Exception ex){}
}
|
| 「戻る」「進む」「中止」「更新」ボタンの有効無効の制御 |
|
「戻る」「進む」「中止」「更新」のボタンが押せる場合以外はDisable状態にする方法 WebBrowserコントロールのcommandStateChangeイベントを利用します。 |
import com.ms.wfc.html.om.shdocvw.*;
WebBrowser mosaic;
private void mosaic_commandStateChange(Object source, CommandStateChangeEvent e)
{
// Busyの状態変化からボタンの有効・無効を設定
if (e.Command == CommandStateChangeConstants.CSC_UPDATECOMMANDS){
boolean busy = mosaic.getBusy();
button_reload.setEnabled(!busy);
button_stop.setEnabled(busy);
}
// Backボタンの状態変化
else if (e.Command == CommandStateChangeConstants.CSC_NAVIGATEBACK){
button_back.setEnabled(e.Enable);
}
// Forwardボタンの状態変化
else if (e.Command == CommandStateChangeConstants.CSC_NAVIGATEFORWARD){
button_forward.setEnabled(e.Enable);
}
}
|
| 名前を付けて保存 |
| 表示中のページ(HTMLや画像ファイルなど)を名前を付けて保存する機能の実装例 |
import com.ms.wfc.html.om.shdocvw.*;
WebBrowser mosaic;
public void savePage(){
try{
mosaic.ExecWB(OLECMDID.OLECMDID_SAVEAS,
OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER,null,null);
}catch(Exception ex){}
}
|
| フォントサイズの取得・変更 |
| フォントサイズ(最大・大・中・小・最小)の取得・変更の方法 サイズは最小(1)〜最大(4)で表します。 |
import com.ms.com.Variant;
import com.ms.wfc.html.om.shdocvw.*;
WebBrowser mosaic;
フォントサイズの取得
public int getFontSize(){
Variant val = new Variant();
try{
mosaic.ExecWB(OLECMDID.OLECMDID_ZOOM,
OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,null,val);
}catch(Exception ex){}
return val.getInt();
}
フォントサイズの変更
public setFontSize(int size)
Variant val = new Variant(fontsize);
try{
mosaic.ExecWB(OLECMDID.OLECMDID_ZOOM,
OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,val,null);
}catch(Exception ex){}
}
|
| ページ設定、印刷 |
| 表示しているページの印刷およびページ設定のダイアログの出し方 |
import com.ms.wfc.html.om.shdocvw.*;
WebBrowser mosaic;
ページ設定
public void settingPage(){
try{
mosaic.ExecWB(OLECMDID.OLECMDID_PAGESETUP,
OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER,null,null);
}catch(Exception ex){}
}
印刷
public void printPage(){
try{
mosaic.ExecWB(OLECMDID.OLECMDID_PRINT,
OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER,null,null);
}catch(Exception ex){}
}
|
| プロパティ |
| 表示しているページのプロパティダイアログの出し方 |
import com.ms.wfc.html.om.shdocvw.*;
WebBrowser mosaic;
public void showProperties(){
try{
mosaic.ExecWB(OLECMDID.OLECMDID_PROPERTIES,
OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER,null,null);
}catch(Exception ex){}
}
|
| 切り取り、コピー、貼り付け、すべて選択 |
| 切り取り、コピー、貼り付け、すべて選択 の各機能の実装例 |
import com.ms.wfc.html.om.shdocvw.*;
WebBrowser mosaic;
切り取り
public void cut(){
try{
mosaic.ExecWB(OLECMDID.OLECMDID_CUT,
OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,null,null);
}catch(Exception ex){}
}
コピー
public void copy(){
try{
mosaic.ExecWB(OLECMDID.OLECMDID_COPY,
OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,null,null);
}catch(Exception ex){}
}
貼り付け
public void paste(){
try{
mosaic.ExecWB(OLECMDID.OLECMDID_PASTE,
OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,null,null);
}catch(Exception ex){}
}
すべて選択
public void selectAll(){
try{
mosaic.ExecWB(OLECMDID.OLECMDID_SELECTALL,
OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER,null,null);
}catch(Exception ex){}
}
|
| 読み込んだドキュメントにアクセスする方法 |
|
現在表示しているページに com.ms.wfc.html.omパッケージのクラスを使ってアクセスする方法。(ほんの1例に過ぎません) WebBrowserインスタンスからドキュメントを取得する方法とdocumentCompleteイベントのイベントオブジェクトからドキュメントを取得する方法の2つの方法があります。 どちらの場合もIHTMLDocument2インターフェースを通してアクセスします。 |
import com.ms.wfc.html.om.*;
import com.ms.wfc.html.om.shdocvw.WebBrowser.*;
WebBrowser mosaic;
WebBrowserのインスタンスからドキュメントを取得
IHTMLDocument2 doc = (IHTMLDocument2)mosaic.getHTMLDocument();
documentCompleteイベントからドキュメントを取得
private void mosaic_documentComplete(Object source, DocumentCompleteEvent e)
{
IWebBrowser2 web = (IWebBrowser2)e.pDisp;
IHTMLDocument2 doc = (IHTMLDocument2)web.getDocument();
}
ドキュメントを取得したら後は
タグの追加・削除や特定のタグだけを抽出したり変更したりといろいろできるようです。
例えば
バナー広告を自動的に削除するブラウザー
画像を収集を支援するブラウザー(^^;)
なんかが作れるでしょう。
|
| ページタイトルの取得 |
|
現在表示しているページ(今読み込んでいるページ)のタイトルを取得する方法 titleChangeイベントを利用します。 |
import com.ms.wfc.html.om.shdocvw.*;
import com.ms.wfc.html.om.shdocvw.WebBrowser.*;
WebBrowser mosaic;
private void mosaic_titleChange(Object source, TitleChangeEvent e)
{
this.setText(e.Text);
}
}
|
| ステータスバーテキストの取得 |
|
読み込み中のステータスバーのテキストを取得する方法 statusTextChangeイベントを利用します。 |
import com.ms.wfc.html.om.shdocvw.*;
import com.ms.wfc.html.om.shdocvw.WebBrowser.*;
WebBrowser mosaic;
private void mosaic_statusTextChange(Object source, StatusTextChangeEvent e)
{
statusBarPanel1.setText(e.Text);
}
|
| POSTデータの覗き方 |
|
ブラウザーからPOSTでSUBMITしたFORMのPOSTデータをサーバーに送る前に覗く方法です。 beforeNavigate2イベントを利用します。 |
import com.ms.com.SafeArray;
import com.ms.wfc.html.om.shdocvw.*;
import com.ms.wfc.html.om.shdocvw.WebBrowser.*;
WebBrowser mosaic;
private void mosaic_beforeNavigate2(Object source, BeforeNavigate2Event e)
{
String postData = null;
//POSTデータ
try{
//POSTデータ無ければ次の行で例外
SafeArray tmp = e.PostData.toSafeArray();
postData = new String(tmp.toCharArray());
}catch(Exception ex){
//POSTデータなし
}
}
|
| 新しいウインドウを開いた場合の対応 |
|
コンテキストメニューまたは Javascriptで新しいウインドウを開いた場合の対応方法 newWindow2イベントを利用します。 アプリケーション内でnewWindow2イベントを処理しない場合には新しいウインドウはIEで開かれます。 下の例のようにすることで一応IEではなく自分で作成したブラウザーで新しいウインドウを開くことができますが 、これだけでは一番最初に開いたウインドウを閉じたときにアプリケーションが終了してしまうため、 複数のウインドウを管理する仕組み(親が見えないMDI?)を実装する必要があります。(ここでは省略) また下の例ではブラウザー(Form)のクラス名を「Mosaic」と仮定してます。 |
import com.ms.wfc.html.om.shdocvw.*;
import com.ms.wfc.html.om.shdocvw.WebBrowser.*;
WebBrowser mosaic;
private void mosaic_newWindow2(Object source, NewWindow2Event e)
{
Mosaic newwin = new Mosaic();//このフォームの新しいインスタンスを作る
WebBrowser nb = newwin.mosaic;
while(nb.getBusy());
e.ppDisp[0] = nb.getApplication();
newwin.show();
}
|
| JavascriptでCloseされた場合の対応 |
| JavascriptでCloseされた場合Formに貼り付けたWebBrowserコントロールだけがCloseされてしまうため、 WebBrowserコントロールのDisposeイベントでFormも閉じるようにします。 |
WebBrowser mosaic;
// ScriptでウインドウをCloseした場合の対応
private void mosaic_dispose(Object source, Event e){
this.dispose();
}
|
| home> | software> |