スポンサーサイト

一定期間更新がないため広告を表示しています

[Google PR]

Twitterはじめました。プラプラ | Twitter

【Access】Access2010でフォームのみ表示(制限ありの検証なしの暫定版)。

Accessのシステムってぱっと見た目でわかりますね。
何故なら、Access本体のメニューバーがあるから。

別にあってもいい(というか、あったほうが便利)と思うのですが、たまにVBチックにフォームのみを表示をしてほしい。という要望があります。

このフォームのみ表示ですが、従来のAccess2003では簡単に実現できました。
起動時にAccess本体を最小化するだけです。(ちなみにフォームはPOPUPに設定しておかないと、画面上に表示されません。あと、APIを使います。)

ただ、Access2010(+Windows7)だと簡単にはいきません。
タスクバーのアプリケーションアイコンをクリックすると、Accessの枠が復元されてしまいます。

下記、今回のケースと同等のお悩みかと思います。
Access2010でフォームのみを表示し、Access本体のウィンドウを表示しない方法はないでしょうか?

対応策の一例としては
Accessウィンドウを表示しない方法 Access2007以降版
Access本体をフォームと同サイズに調整し、その中でフォームを最大化して表示するという手法です。

なるほど、なるほど。ですが、他にも方法がないかなあ。
ということで、ちょっと考えてみました。

要は復元(最大化)されても、最小化すればいいんじゃないの


Access2010では、タスクバーのアプリケーションアイコンをクリックするとAccess本体が復元されてしまいます。で、あれば、復元されてもすぐに最小化すればいいんじゃないの?

と思ったのですが、Aceessには「アプリケーションが最大化された時」というイベントがありません。(アプリケーションを最大化するというコマンドならありますが。)
最大化を知るためには、Windowsのメッセージをフックする必要があるようです。

ならば、フォームをサブクラス化し、Windowsからの最大化命令(メッセージ)を監視し、最大化されれば、即最小化しちゃいましょう。(なんつー、大掛かりな。。。)

実装的には、起動時に最大化監視用のフォームを非可視でシステム終了まで起動しておきます。
<監視用のフォーム>
最大化監視(サブクラス化)

<フォームのイベント>

Private Sub Form_Open(Cancel As Integer)
'サブクラス化
OldWndProc = GetWindowLong(Application.hWndAccessApp, GWL_WNDPROC)
SetWindowLong Application.hWndAccessApp, GWL_WNDPROC, AddressOf WndProc
End Sub

Private Sub Form_Close()
'サブクラスを破棄する
SetWindowLong Application.hWndAccessApp, GWL_WNDPROC, OldWndProc
End Sub

<標準モジュール>
'*以下のソースは、
[VB6] ウィンドウプロシージャのサブクラス化サンプル v0.3
を参考にさせていただきました。

Option Compare Database
Option Explicit


'指定されたウィンドウプロシージャにメッセージ情報を渡す関数の宣言
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

'指定されたウィンドウの属性を取得する関数の宣言
Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long) As Long

'指定されたウィンドウの属性を変更する関数の宣言
Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long

' Access自身を最小化設定する為のAPI 宣言
Public Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, _
ByVal nCmdShow As Long) As Long

Public Const SW_SHOWMINIMIZED = 2

Private Const WM_SIZE = &H5
Private Const SIZE_MAXHIDE = 4
Private Const SIZE_MAXIMIZED = 2
Private Const SIZE_MAXSHOW = 3
Private Const SIZE_MINIMIZED = 1
Private Const SIZE_RESTORED = 0

Public OldWndProc As Long
Public Const GWL_WNDPROC = -4

Const WM_SYSCOMMAND As Integer = &H112
Const SC_CLOSE As Long = 61536

'アプリケーションの最大化を監視する
Public Function WndProc(ByVal hwindow As Long, ByVal message As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'メッセージ処理
Select Case message

'サイズ変更イベント
Case WM_SIZE

Select Case wParam

'ウィンドウ最大化時
Case SIZE_MAXIMIZED

'Accessアプリケーションを最小化する
Call ShowWindow(Application.hWndAccessApp, SW_SHOWMINIMIZED)

End Select

'アプリケーション終了
Case WM_SYSCOMMAND
If wParam = SC_CLOSE Then
'終了ボタン以外からのアプリケーション終了は無効とする
MsgBox "システム終了ボタンからアプリケーションを終了してください。", 48, p_strAPPRICATION_TITLE
Exit Function
End If

End Select

'デフォルトメッセージ処理
WndProc = CallWindowProc(OldWndProc, hwindow, message, wParam, lParam)

End Function

<その他>
あと、システムの終了処理で、監視フォームを閉じることが必要です。


これで、それっぽく動くのですが、暫定版と名うったのは、エラー処理をしていないことはさることながら、ちょっとくせが強いためです。

サブクラス化の副作用として、サブクラス化を終了せずにアプリケーションを終了すると強制終了してしまいます。これはちょっと厳しい。とりあえずの対応策として、終了処理をキャンセルする処理も入れました。
あくまでも、システム内の終了処理ボタンで監視フォームを閉じてから、アプリケーションを終了させる必要があります。

あと、2画面を用いて、サブモニタに表示させることも難しいです。
フォームをサブモニタへ移動させても、再度開き直すとメインモニタに戻ってしまいます。(これは、Access2003の時も同じかもしれませんん。未確認)

等々ありますので、参考程度にどうぞ。

[Google PR]

Twitterはじめました。プラプラ | Twitter

スポンサーサイト

[Google PR]

Twitterはじめました。プラプラ | Twitter

<< 【iOSアプリ】「パチンコCR哲也〜雀聖と呼ばれた男〜」が、な、なんとセールで300円です!
【デジモノ】インターリンクのグローバル固定IPがお安くなりました!自宅版やモバイルSIMをまとめてご紹介。 >>

[関連エントリ 最新5]

[Google PR]


[最新エントリ 5]

>>トップページ

コメント
コメントする(お気軽にどうぞ)









この記事のトラックバックURL
トラックバック
カテゴリー
プロフィール
links
recent comment
  • 【Access】コンボボックス対応版。超簡単な帳票フォームでの矢印上下キー行移動。
    山田 裕樹 (04/28)
  • 【Access】vbaでhmacが正しく計算できた!!
    まさ (06/01)
  • 【Access】AccessReportMailメール送信時のポートを25から587へ
    わら (05/31)
  • 【SQLServer】超シンプル!再帰CTE(共通テーブル式)で連続データを作成する。
    sazi (09/08)
  • 【あまっちゃお】Amazon商品検索「あまっちゃお」プロジェクト始動。Ver00-06-00 β
    カメちゃん (07/31)
  • 【Access】あれ?DoCmd.RunCommand acCmdSaveRecordの内部仕様が変わった?
    花姉 (03/17)
  • 【Access】実行中のmdb(自分自身)をバックアップコピーする方法。
    亀 (02/06)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    管理人 (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    あ (01/31)
  • 【雑記】Amazonでの注文時、TMGさん発送にご注意を。納期を守れない可能性あり!
    K (11/13)
recent trackback
  • 【Access】2003安全でない式がブロックされていませんとセキュリティーレベル。
    awgs Foundry (10/29)
  • 【VAIOtypeP】液晶保護シートは、新車のカバーではない。レイアウト社液晶/天板保護フィルムセットRT-VP1FS1
    XMLがキライ。 (04/09)
  • Vistaから、LinkStation(NAS)にアクセスできません。
    そのほかいろいろ (09/06)
sponsored links