2008年03月26日

ポップアップブロック回避策

ASP.NETに限らずWebシステムではJavascriptのwindow.open()を使いサブウィンドウを開く場面がよくある。
これがWindowsXP ServicePack2から導入され、Googleツールバーにもあるポップアップブロックによって、効かなくなることがある。それぞれ設定を解除させれば良いが、今回紹介するのは設定解除することなく、回避する方法である。

調べてみると意外に簡単に方法が見つかった。
そもそもポップアップブロックはユーザーが自らの意思でボタンを押したものには働かない。自動で(勝手に)開くウィンドウを阻止するものである。よってサーバーサイドで実行したものは必ずブロックされてしまう。
そこでクライアントサイドのOnClickイベント内で開くように変更すれば良いのである。

例:onclick="window.open('hoge.aspx');return false;"
※最後のreturn falseはonclckイベントを最終的にキャンセルさせることでwindow.open()だけを実行させる意味がある。

ただ、このサーバーサイドからクライアントサイドへの変更には結構問題が起こる。特に入力フォームの内容を取得してからでないと次の処理を決められないときなど一度ポストバックが必要な時がそれにあたる。この点に関しては事前に入力フォームのイベント内でポストバックさせて取得しておくしかない。

サンプルはこちら−>popup.lzh

なおサンプルをテストする場合、開発環境からの実行ではポップアップブロックが無視されるのでIIS等でサイトを立てて実行すること。またURLにlocalhostを使うとローカルイントラネットゾーンとなりこれもポップアップブロックが解除される(但しGoogleツールバーのポップアップブロックは有効)。IPアドレスを指定すればインターネットゾーンになりポップアップブロックが有効になるので、回避の効果が確認できる。

サンプルの実行画面

1.起動画面
上の段がサーバーサイドでのwindow.openでポップアップブロックが掛かってしまう。下の段がその回避策である。
サンプルの起動画面

2.ポップアップブロックが効いた
ポップアップブロックが効いた

3.Googleツールバーのポップアップブロックが効いた
Googleのポップアップブロック

4.ポップアップブロック回避策で無事オープン
回避策
posted by なっちゃん at 17:15| 静岡 ????| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

2008年03月19日

既存アプリのVista対応・改造計画:追加「マニフェストファイルの組込」

VistaではUAC(ユーザーアカウント制御)のため例え管理者としてログインしている場合でも標準ユーザーとしての権限でしかプログラムが実行されない。そこで管理者モードで実行できるように昇格させるためにマニフェストを用意することを以前紹介した。
このマニフェストはプログラム本体とは別ファイルになっているので、うっかりしてプログラムだけ移動したりすると使えないという問題が発生する。そこで今回はこれをプログラム内部に組み込む方法を紹介する。
VB6で作ったプログラムでもVB.NET(VB2005)で作ったプログラムでも同じ方法である。
但しVS.NET(VS2005)の開発環境が必要なのでVB6しかない方は諦めて(^^;

で、方法はというと下のURLにあります。

.NET TIPS :「マニフェスト・ファイルをアプリケーションに組み込むには?

やはり引用先まで毎回見に行くのも面倒なので、手順のみ紹介します。

1.「ファイルを開く」で組み込み先のEXEファイルを選択
ファイルを開く

2.EXEファイルを右クリックして「リソースの追加」を選択
リソースの追加

3.「インポート」から予め作成しておいたマニフェストファイルを選択し、リソースの種類を「RT_MANIFEST」と入力
マニフェストをインポート

4.IDを101から1に変更し、保存。
IDを変更してから保存

以上で完了。

あと訂正ですが、以前VB6でマニフェストを使うにはネイティブコンパイルをしておかないと駄目だと紹介しましたが、P-Codeコンパイルでも問題無く動きました。
(でも変だなぁ、その当時は確かにP-Codeでは動かなかったと記憶しているだけどなぁ・・・・。)
posted by なっちゃん at 18:12| 静岡 ?J| Comment(0) | TrackBack(0) | Windows Vista | このブログの読者になる | 更新情報をチェックする

2008年03月06日

VB6のhDCプロパティはVB.NET(VB2005)ではどうなる?

VB6でグラフィック関連のWindowsAPIを使うときは必ずと言ってよいほどコントロール(FormやPictureBox)のデバイスコンテキストであるhDCプロパティを指定する。

これをVB.NET(VB2005)で使おうとしてアップデートウィザードを使うと肝心のhDCが「'UPGRADE_ISSUE: Form プロパティ Form1.hdc はアップグレードされませんでした。」となり使えない。別件だが同じくWindowsAPIでよく使うウィンドウハンドル(.hWnd)は、.NET Frameworkでは(コントロール).Handleというプロパティになっており判りやすい。
いったいhDCはどうすれば指定できるのだ?と思い調べてみたところこんな具合になった。VB6との比較で紹介する。

例として起動したフォームの座標(x,y)地点の色(RGB値)を取得するGetPixel関数で説明する。
この関数の定義は以下の通り、最初の引数にhDCを渡す。
Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

VB6:
Dim iro As Long
iro = GetPixel(Me.hdc, x, y) 'たったこれだけ。
 
VB.NET/VB2005:
Dim gp As Graphics = Me.CreateGraphics 'フォームのGraficsを作成
Dim hDC As IntPtr = gp.GetHdc() 'そのデバイスコンテキストを取得
Dim iro As Long = GetPixel(hDC, x, y) 'やっと使える
posted by なっちゃん at 19:56| 静岡 ????| Comment(0) | TrackBack(0) | VB vs VB.NET | このブログの読者になる | 更新情報をチェックする