HSPでシンプルな艦これ専用ブラウザ
こんな感じのピッタリサイズの艦これ専用ブラウザ。
HSPでCOM(IEコンポーネント)を扱ってみたかった。
といっても見つけたサンプルコードに、艦これの位置調整機能やら、拡大縮小機能やらを追加しただけです。
プログラムとソースコードのダウンロード
→ knkrBrowserHSP_20141113.zip (987 KB) 453 ダウンロード
自分の環境(Win7 + IE11)では動いたけど、その他は確認してません。
仕様変更で使えなくなるかもしれないし、不具合が起こるかもしれません。
もしexeファイルやソースファイルを利用される方が居らっしゃいましたら、自己責任でお願いします。
2014/11/13追記
なんか色々不安定だったので、COMイベント処理等を修正しました。
↑のダウンロードリンクのzipファイルを差し替えました。
ついでにスクリーンショット機能をつけました。
タイトルバーを右クリックすると、以下の画像のような項目が出ます。
「スクリーンショットを撮る」をクリックするとシャッター音が鳴り、exeファイルと同じ場所のScreenShotフォルダに画像を保存します。
↓以下ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 |
//---------------------------------------------------------------------------- // 艦これブラウザHSP //---------------------------------------------------------------------------- #include "user32.as" #include "gdi32.as" #include "hspcv.as" //---------------------------------------------------------------------------- // 共通定義 //---------------------------------------------------------------------------- //オーバーラップウインドウに変更するときに必要な定義 #define GWL_STYLE 0xFFFFFFF0 #define WS_OVERLAPPEDWINDOW 0x14CF0000 #define SWP_NOSIZE 0x01 #define SWP_NOMOVE 0x02 #define SWP_FRAMECHANGED 0x20 //Windowsメッセージ定義 #define WM_SIZE 0x05 #define WM_SYSCOMMAND 0x0112 //BitBlt関数で使用するラスタオペレーションコード #define SRCCOPY 0x00CC0020 //COMイベントインターフェースID #define DIID_DWebBrowserEvents2 "{34A715A0-6587-11D0-924A-0020AFC7AC4D}" //COMイベントのディスパッチID #define DISPID_DOCUMENTCOMPLETE 259 //ゲーム(Flash)の大きさとアス比 #define GAME_WIDTH 800 #define GAME_HEIGHT 480 gameAspectRait = double(GAME_HEIGHT) / double(GAME_WIDTH) //システムメニュー項目ID #enum IDM_SS_JPG = 0x01 #enum IDM_SS_PNG = 0x02 #enum IDM_SS_BMP = 0x04 #enum IDM_SS_OPEN = 0x08 #enum IDM_WSIZE_DEFAULT = 0x10 //---------------------------------------------------------------------------- // start //---------------------------------------------------------------------------- //ウインドウの作成 screen 0,ginfo_dispx,ginfo_dispy,0, , , GAME_WIDTH, GAME_HEIGHT //ウインドウスタイルをオーバーラップウインドウに SetWindowLong hwnd,GWL_STYLE,WS_OVERLAPPEDWINDOW SetWindowPos hwnd, 0, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_FRAMECHANGED //ウインドウのクライアントサイズを艦これにあわせる gosub *fitClientWindowSizeToGame //ウインドウサイズ変更時のメッセージハンドラを設置 oncmd gosub *onWM_SIZE, WM_SIZE //背景色 color 0,0,0:boxf //タイトルバー文字列 title "艦これブラウザHSP" //システムメニューイベントハンドラの設置 oncmd gosub *syscommand, WM_SYSCOMMAND //システムメニューのハンドルを取得 GetSystemMenu hwnd, 0 hSystemMenu = stat //項目の追加 InsertMenu hSystemMenu, 0, $400, IDM_SS_JPG, "スクリーンショットを撮る JPG形式(&J)" InsertMenu hSystemMenu, 1, $400, IDM_SS_PNG, "スクリーンショットを撮る PNG形式(&P)" InsertMenu hSystemMenu, 2, $400, IDM_SS_BMP, "スクリーンショットを撮る BMP形式(&B)" InsertMenu hSystemMenu, 3, $400 | $800, 0, "" InsertMenu hSystemMenu, 4, $400, IDM_SS_OPEN, "スクリーンショットのフォルダを開く(&F)" InsertMenu hSystemMenu, 5, $400 | $800, 0, "" InsertMenu hSystemMenu, 6, $400, IDM_WSIZE_DEFAULT, "画面サイズをデフォルトに戻す(&1)" InsertMenu hSystemMenu, 7, $400 | $800, 0, "" //IEコンポーネントの設置 objsize GAME_WIDTH,GAME_HEIGHT axobj IE, "Shell.Explorer.2", ginfo_winx ,ginfo_winy hIE = objinfo(stat, 2) //ハンドルの取得 comevent ie_event, IE, DIID_DWebBrowserEvents2, *WebBrowserEvent //COMイベントの取得開始 //ログイン終了フラグの初期化 bLoginFinished = 0 //ログインページに移動 url = "http://www.dmm.com/netgame/social/-/gadgets/=/app_id=854854/" IE->"Navigate" url //---------------------------------------------------------------------------- // ラベル //---------------------------------------------------------------------------- *main stop *WebBrowserEvent //COMイベント処理 dispid = comevdisp(ie_event) if (dispid == DISPID_DOCUMENTCOMPLETE){ //ページ読み込みが終了した時 wait 10 pDoc = IE("Document") //IHTMLDocument2インターフェースを取得 //pDocのtitleプロパティから、ゲームページであるか判断 docTitle = pDoc("title") if(instr(docTitle, 0, "艦隊これくしょん") != -1){ //ゲームページだったら if(bLoginFinished == 0){ //インラインフレームのFlashを抽出 pGameFrame = pDoc("getElementById", "game_frame") inlineFrameURL = pGameFrame("getAttribute", "src") IE->"Navigate" inlineFrameURL bLoginFinished = 1 return } } //スクロールしないようにする if(bLoginFinished == 1){ pBody = pDoc("body") //body要素のIHTMLElement2インターフェース pStyle = pBody("style") //IHTMLStyle2インターフェース pBody("scroll") = "no" } //ページのスクロール位置調整 pWindow = pDoc("parentWindow") //IHTMLWindow2インターフェース if(bLoginFinished == 0){ //ログインページの時 pWindow->"scroll" 70 ,75 } else{ //ゲームページの時 SetWindowPos hIE, 0, 0, 0, 800, 480,0 pWindow->"scroll" 0 ,16 } } return *fitClientWindowSizeToGame //ウインドウのクライアントサイズを艦これにあわせる newWidth = ginfo_sizex - ginfo_winx + GAME_WIDTH //ウインドウ枠を含めた幅を算出 newHeight = ginfo_sizey - ginfo_winy + GAME_HEIGHT SetWindowPos hwnd, 0, 0, 0, newWidth, newHeight,SWP_NOMOVE return *scaleGameArea //ゲームエリアの拡大縮小 pDoc = IE("Document") if(pDoc("ReadyState")=="complete"){ //クライアントウインドウのアスペクト比の取得 clientAspectRaito = double(ginfo_winy) / double(ginfo_winx) //アスペクト比により、拡大率やIEコンポーネントオブジェクトの位置の値を決定 if(clientAspectRaito > gameAspectRait){ //ウインドウが縦に長い時 scaleFactor = double(ginfo_winx) / double(GAME_WIDTH) //拡大率 IEposX = 0 //IEコンポーネントの移動先X座標 IEposY = (ginfo_winy - double(GAME_HEIGHT)*scaleFactor)/2 IEwidth = ginfo_winx //IEコンポーネントの幅 IEheight = double(GAME_HEIGHT)*scaleFactor } else : if(clientAspectRaito < gameAspectRait){ //ウインドウが横に長い時 scaleFactor = double(ginfo_winy) / double(GAME_HEIGHT) IEposX = (ginfo_winx - double(GAME_WIDTH)*scaleFactor )/2 IEposY = 0 IEwidth = double(GAME_WIDTH)*scaleFactor IEheight = ginfo_winy } else : if(clientAspectRaito == gameAspectRait){ //ウインドウのアス比がゲームと同じ時 scaleFactor = double(ginfo_winx) / double(GAME_WIDTH) IEposX = 0 : IEposY = 0 : IEwidth = ginfo_winx : IEheight = ginfo_winy } //IEコンポーネントオブジェクトの位置合わせと拡大縮小 SetWindowPos hIE, 0, int(IEposX), int(IEposY), int(IEwidth), int(IEheight), 0 //Flashのエレメントを取得 pFlash = pDoc("getElementById", "flashWrap") pStyleFlash = pFlash("Style") //ゲーム画面(Flash)の拡大縮小と位置合わせ pStyleFlash("zoom") = scaleFactor //エレメントの場所までスクロール pFlash->"scrollIntoView" "true" } return *onWM_SIZE //ウインドウサイズ変更のメッセージが飛んできた時の処理 //最小化した時は無効 IsIconic(hwnd) if(stat):return //ゲーム表示時、ウインドウサイズ変更でゲームエリアの拡大縮小 if(bLoginFinished){ gosub *scaleGameArea } else{ //ログイン画面の時はサイズ変更させない gosub *fitClientWindowSizeToGame } return *syscommand //システムコマンドが命令された時 switch wparam case IDM_SS_JPG case IDM_SS_PNG case IDM_SS_BMP //スクリーンショットを撮る wait 20 //メインウインドウのデバイスコンテキストのハンドルを取得 GetDC hwnd hdcTarget = stat //スクショ用のバッファを初期化し、これを画面制御命令先に指定 buffer 1, ginfo(12), ginfo(13), 0 //メインウインドウ→バッファへ画像をコピー BitBlt hdc, 0, 0, ginfo(12), ginfo(13), hdcTarget, 0, 0, SRCCOPY //デバイスコンテキスト開放 ReleaseDC hwnd, hdcTarget //保存フォルダの存在チェックと作成 dirlist x, "ScreenShot", 5 if (stat == 0){mkdir "ScreenShot"} //拡張子の決定 extension = ".bmp" if(wparam == IDM_SS_JPG){extension = ".jpg"} if(wparam == IDM_SS_PNG){extension = ".png"} //ファイル名とパスを決める fileName = strf("%04d_%02d%02d_%02d%02d_%02d", gettime(0), gettime(1), gettime(3), gettime(4), gettime(5), gettime(6)) savePath = "ScreenShot\\" + fileName + extension //CVバッファを初期化、コピーして保存 cvbuffer 0, ginfo(12), ginfo(13) cvputimg 0 cvsave savePath //音を鳴らす mmload "capture.wav",0 mmplay 0 //画面制御命令先をメインウィンドウに戻す gsel 0, 0 swbreak case IDM_SS_OPEN exec "explorer ScreenShot" swbreak case IDM_WSIZE_DEFAULT gosub *fitClientWindowSizeToGame swbreak default swbreak swend return |
補足
51行目:ゲームの大きさを自由に拡大縮小出来るようにしたかったので、Windows APIのSetWindowLong関数でオーバーラップウインドウスタイルに変更する(HSPで作られるデフォルトのウインドウはサイズ変更不可)
SetWindowLong関数を呼び出した後は、必ずSetWindowPos関数を呼び、位置や大きさを変更せずともSWP_FRAMECHANGEDフラグを指定し、ウインドウスタイルの変更をすぐに適用しなければならない。そうでないとウインドウ枠やクライアントエリアの描画が崩れたりする。Aero有効時は特に崩れないが、Aeroオフの時や、WindowsXP以前の描画方式だと崩れる
Web上のHSPのサンプルでは、SetWindowLong関数を呼んでないものも結構あったので注意。
最近のコメント