転職・就職・総合求人サイト WORKTANK

WFC Tips

  home> software>        

WFCとは・・・
WFC (Windows Foundation Classes for Java)は MicrosoftのJavaVMでのみ動作するJ/Direct機能をがんがん使って Win32APIをラッピングしたクラスライブラリで、VisualJ++6.0の RAD機能と組み合わせることによって簡単にWindows上で動作するアプリケーションが作成できます。
ActiveXコントロールやCOM DLLをJ/Directで利用するためのラッパークラスを自動的に作成する機能も備えているので VisualBasic用として出回っているコントロールの多くもVisualJ++で利用することができます。(利用できない物もあります。また正式にVisualJ++をサポートしている製品以外は動作保証はないでしょう。正式にサポートしている製品は見たことがないが・・・) また自分でWFCコントロール、ActiveXコントロール、COM DLLを作成することもできます。
しかし・・・
次期バージョンのVisualStudio.NETにVisualJ++は含まれないようです。 それなのになぜいまさらWFCの情報を載せるのか?それは個人的趣味(^^)というのが 当たりなんですが、VisualStudio.NETのベータ版をちょっと触ってみて(C#のみですが・・・)思ったのですが 「将来 .NET Framework用に移植するという前提で現行Windowsプラットフォーム用のアプリケーションを作る」 という場合においてVisualJ++6.0+WFCの選択ってのはそんなに悪くはないかなーと。 (ただし暗黙的にimportされるjava.lang以外のjavaパッケージを使わず代わりにcom.ms以下のパッケージを使うようにしないと辛いかも。)
このページはいつかはゴミになってしまいますが行けるとこまで行ってみよー。
WFC Tips
WFC(J/Direct含む)については参考になる情報が 他の言語・やツールに比べて圧倒的に 少ない(特に日本では)ためかなり苦労してきました。 まとまりのない情報ですがTipsとして載せていきます。

  • ドライブリストの取得とドライブの種類の判別
  • 特殊なフォルダのパスを得る
  • フォルダの中をすべて削除する。
  • ファイルの更新日付を得る。
  • クリップボードの使用
  • プロセスの起動
  • レジストリの操作
  • 画面のキャプチャ
  • WAVの再生
  • 2重起動のチェック
  • アプリケーション同士の通信
  • フォルダ選択ダイアログ
  • ネットワークリソースの取得



  • WebBrowserコントロールの利用
    WebBrowserコントロールを利用してブラウザーを作るための方法
  • FORMにWebBrowserコントロールを貼り付ける
  • URLを指定してWEBページを読み込む
  • 「戻る」「進む」「ホーム」「中止」「更新」ボタン押下処理
  • 「戻る」「進む」「中止」「更新」ボタンの有効無効の制御
  • 名前を付けて保存
  • フォントサイズの取得・変更
  • ページ設定、印刷
  • プロパティ
  • 切り取り、コピー、貼り付け、すべて選択
  • 読み込んだドキュメントにアクセスする方法
  • ページタイトルの取得
  • ステータスバーテキストの取得
  • POSTデータの覗き方
  • 新しいウインドウを開いた場合の対応
  • JavascriptでCloseされた場合の対応



  • 関連情報
  • shdocvw パッケージ ドキュメント(メソッドの一覧のみ)
  • mshtml パッケージ ドキュメント(メソッドの一覧のみ)


  • ドライブリストの取得とドライブの種類の判別
    マイコンピュータ内のドライブ一覧の取得方法とドライブの種類の判別方法。
    リムーバブルドライブ、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ディスク
    }
    
    Tips一覧に戻る

    特殊なフォルダのパスを得る
    デスクトップフォルダ等の特殊なフォルダのパスを得る方法。
    特殊なフォルダのパスは com.ms.wfc.app.SystemInformationクラスのスタティックメソッド
    getSpecialFolderPathで得ることができます。
    メソッドの引数にはcom.ms.wfc.app.SpecialFolderで定義されているフィールドを指定します。
    
    (例)現在のユーザーのデスクトップフォルダを得る
    String desktop = SystemInformation.getSpecialFolderPath(SpecialFolder.DESKTOP_DIRECTORY);
    
    Tips一覧に戻る

    フォルダの中をすべて削除する。
    指定したフォルダに含まれるファイルとフォルダを全て削除する。 フォルダは再起的に階層を下って全てのフォルダが削除されます。
    この例では「フォルダに含まれるファイルを列挙する」「フォルダのアトリビュートを得る」 「ファイルの削除」「フォルダの削除」の方法が含まれています。
    import com.ms.wfc.io.*;
    
    /**
     * 指定フォルダの中のファイルをすべて削除(指定したフォルダは残る)
     * @param path 中身を削除したいフォルダのパス
     * @return true:成功
    false:失敗 */ public static boolean deleteAllFiles(String path){ try{ FileEnumerator enum = new FileEnumerator(File.combine(path,"*.*")); while(enum.hasMoreFiles()){ String fname = enum.getName(); if (fname.equals(".") || fname.equals("..")) continue; String fullname = File.combine(path,fname); if (enum.getAttributes() & FileAttribute.DIRECTORY) == 0){ File.delete(fullname); } else{ if (!deleteAllFiles(fullname)) return false; File.removeDirectory(fullname); } } }catch(Exception ex){ return false; } return true; } ※ファイルのリストはFile.getFilesメソッドでも取得できます。
    Tips一覧に戻る

    ファイルの更新日付の取得
    ファイルの更新日付は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;
    }
    
    Tips一覧に戻る

    ドライブリストの取得とドライブの種類の判別
    マイコンピュータ内のドライブ一覧の取得方法とドライブの種類の判別方法。
    リムーバブルドライブ、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ディスク
    }
    
    Tips一覧に戻る

    クリップボードの利用
    クリップボードを利用してコピー、貼り付けする方法。
    この例ではデータ形式はテキストまたは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);
        }
        //以下に貼り付け処理を記述
    }
    
    Tips一覧に戻る

    プロセスの起動
    アプリケーションから別のプロセスを起動する。この方法の場合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);
    }
    
    Tips一覧に戻る

    レジストリの操作
    レジストリにキーや値を作成したり、値の取得・変更の方法
    //キーの作成
    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();
    
    Tips一覧に戻る

    画面のキャプチャ
    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;
    }
    
    Tips一覧に戻る

    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_で始まる)定義されてます。
    
    Tips一覧に戻る

    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;
    }
    
    Tips一覧に戻る

    アプリケーション同士の通信
    これまたいろいろ方法はありますが、相手のハンドルを使って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;
        //受け取ったデータの処理を以下に記述
    }
    
    
    Tips一覧に戻る

    フォルダ選択ダイアログ
    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);
    }
    
    Tips一覧に戻る



    ネットワークリソースの取得
    ネットワークリソースに関しては全くクラスが用意されていないので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);
    
    
    Tips一覧に戻る



    FORMにWebBrowserコントロールを貼り付ける
    FORMにWebBrowserコントロールを貼り付ける方法としては調べた限りでは3つの方法がありました。
    1.HTMLControlコントロール(WFC)を使う
    デフォルトでツールボックスに入っているので一番簡単な方法なのですが、 Webブラウザーとして必要なイベント・メソッドが用意されていません。 単純にHTMLを表示してHTMLにアクセスするだけならいろいろ便利な メソッドがあるようです。(今回は不採用)
    2.shdocvw.dll(ActiveXコントロール)からツールボックスに追加する
    メニュー>ツール>ツールボックスのカスタマイズ>ActiveXコントロールタブ>参照で shdocvw.dllファイルを選択するとツールボックスにWebBrowserコントロールが追加され、 同時にshdocvw.dllを利用するためのラッパークラスのソースが生成されます。
    この方法の欠点としてはDLLに含まれる機能全てに対するラッパークラスが生成される ため、コンパイル時間が長くなったり、配布パッケージのサイズが 大きくなったりというのがあります。 使わないラッパークラスを削除することもできますが、 選別はちょっと面倒だったりします。また、com.ms.wfc.html.om.shdocvwパッケージに ほぼ同じラッパークラスが存在するので 重複するクラスを持つことになります。(今回は不採用)
    3.com.ms.wfc.html.om.shdocvw.WebBrowserパッケージを使う
    com.ms.wfc.html.om.shdocvw.WebBrowser.WebBrowserクラスが「2」の方法でActiveXコントロールから生成したshdocvw.WebBrowser.WebBrowserクラスに相当します。
    このクラスがツールボックスに追加できれば簡単なのですができないようなので次のようにソースを直接編集してコントロールを貼り付けます。
  • 1.WebBrowserコントロールを貼り付けるFORMを「デザイナの表示」で開きHTMLControlを貼り付けて閉じる
  • 2.「コードの表示」で開き「HTMLControl」を「com.ms.wfc.html.om.shdocvw.WebBrowser.WebBrowser」に置換して置き換える。
  • 3.「デザイナの表示」で貼り付けられていることを確認
    この方法の問題は「MSDNライブラリに載っていない」、 「WebBrowserクラス内のメソッドは @hidden の指定が入っていて親から継承したメンバしか見えない」 という2点ですが、MSDNライブラリに載っていない情報ってのは他にもいっぱいあるので気にすることはありません(笑)。 WebBrowserクラス内のメソッドについてはある方法でJavadocしてまとめています。 → 関連情報
    ※このパッケージの使用はあまり奨励されていないような気もするのですが今回はこの方法を採用しました
  • 他の項目(Tips)でも「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>