プロが教える店舗&オフィスのセキュリティ対策術

アプリを起動すると、フォーム等を表示しないでタスクバーにアイコンを表示、常駐する。
そのアイコンがダブルクリックするとフォーム等を開く・・・というアプリを作っています。
API関数で、タスクバーへアイコンを追加、アイコンの削除というのはできたのですが、そのアイコンをダブルクリック(又は、右クリックでメニュー選択)したときフォームが開く、というのが出来ませんでした。
ダブルクリックしたときには、何らかのイベントが動くのでしょうか?それとも、API関数で、それを監視、実行させなくてはならないのでしょうか?

A 回答 (3件)

メニューは表示できてるのですか?

    • good
    • 0

あっすいません。

よく読んだら、メニューが出てないようですね。

情報をください。

1.Shell_NotifyIconのパラメータのNOTIFYICONDATA構造体に収めてる各値
2.右クリックで表示したいメニュー名
3_1.メニューの中に「フォームが開く」というコマンドがあった場合は、そのフォームを開く命令を持ったメニュー名
3_2.メニューの中に「フォームが開く」というコマンドがない場合は、開きたいフォーム名
    • good
    • 0

レスがないので、勝手にサンプルです。




タスクの処理は様々方法がありますが、ばくの知ってるパターンは大きく分けて3つあります。

1.ピクチャボックスのマウスイベントにタスクのイベントを流し込む
このサンプルの方法です。サンプルでは、フォーム1のアイコンをピクチャボックスに呼び込み、ピクチャボックスのイベントによって処理を分けています。

2.フォームのマウスイベントにタスクのイベントを流し込む。
このサンプルとほとんど変わらない方法ですが、ダミーの非表示のフォームを使用するのであれば、このような手段をとります。サンプル1よりピクチャボックス一つ分だけEXEが軽くなります。(ほんの数バイトなのですが・・・)

3.NOTIFYICONDATA構造体にWM_USER定数を使用し、プロセス監視を行う。
一番EXEを軽くすることのできる処理ですが、デバッグ途中で止めるとVBが落ちます。プロセス監視が未経験である場合はお奨めしません。




※必要なもの
プロジェクト[Project1]
├フォーム[Form1]
│├ピクチャボックス[Picture1]
│└メニュー[メニューエディタによる作成:フォーム1のメニュー構造を参照]

└フォーム[Form2]


※フォーム1のメニュー構造
右クリックメニュー[mnuRight]
├別フォームを開く[mnuRightMenu1]
└終了[mnuRightMenu2]


以下のソースをフォーム1に貼り付けてください。
Option Explicit

Private Enum TSK_MODE
  TSK_ADD
  TSK_DEL
  TSK_UPDATE
End Enum
Private Type NOTIFYICONDATA
  cbSize As Long
  hwnd As Long
  uID As Long
  uFlags As Long
  uCallbackMessage As Long
  hIcon As Long
  szTip As String * 64
End Type

Private Const NIM_ADD = &H0 'アイコンを追加
Private Const NIM_DELETE = &H2 'アイコンを削除
Private Const NIM_MODIFY = &H1 'アイコンを変更
Private Const NIF_ICON = &H2 '
Private Const NIF_MESSAGE = &H1 '
Private Const NIF_TIP = &H4 '

Private Const WM_MOUSEMOVE = &H200 'マウスが移動した
Private Const WM_LBUTTONDOWN = &H201 '左のマウスボタンを押した
Private Const WM_LBUTTONUP = &H202 '左のマウスボタンが解放された
Private Const WM_LBUTTONDBLCLK = &H203 '左のマウスボタンをダブルクリックした
Private Const WM_RBUTTONDOWN = &H204 '右マウスボタンを押した
Private Const WM_RBUTTONUP = &H205 '右マウスボタンを解放した
Private Const WM_RBUTTONDBLCLK = &H206 '右のマウスボタンをダブルクリックした

Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long

'メニュ1(別フォームの表示)
Private Sub mnuRightMenu1_Click()
  Form2.Show
End Sub

'メニュ2(終了)
Private Sub mnuRightMenu2_Click()
  Unload Me
  End
End Sub

'タスクトレイピクチャボックスイベント
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
  Dim nMessage  As Long
  Dim wkFlg    As Boolean
  Dim i      As Long
  Static DBLCTime As Long
  
  ' マウスメッセージの作成
  nMessage = x \ Screen.TwipsPerPixelX
  
  With Me
    Select Case nMessage&
      'マウスムーブの処理
      Case WM_MOUSEMOVE
      
      '左ボタンダウン時の処理
      Case WM_LBUTTONDOWN
      
      '左ボタンアップ時の処理
      Case WM_LBUTTONUP
      
      '左ボタンダブルクリック時の処理
      Case WM_LBUTTONDBLCLK
        Call mnuRightMenu1_Click
        
      '右ボタンダウン時の処理
      Case WM_RBUTTONDOWN
      
      '右ボタンアップ時の処理
      Case WM_RBUTTONUP
        'フォーカスがタスクトレイに移るので、自分自身にセットする
        'これによりESCキーによるキャンセルが有効になる
        Call SetForegroundWindow(.hwnd)
        
        'メニューの表示
        Call PopupMenu(.mnuRight)
      
      '右ボタンダブルクリック時の処理
      Case WM_RBUTTONDBLCLK
      
    End Select
  End With
PGMEND:
End Sub

'フォームロード時の初期設定
Private Sub Form_Load()
  With Me
    'ピクチャボックス非表示
    .Picture1.Visible = False
    
    'フォームのアイコンをピクチャボックスに描画
    .Picture1.Picture = .Icon
    
    'タスクトレイにアイコン表示
    Call IconTray(.Picture1, TSK_ADD, "ツールメッセージ")
  End With
End Sub

'フォーム終了時にタスクトレイアイコン削除
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  With Me
    Call IconTray(.Picture1, TSK_DEL)
  End With
End Sub

'タスクトレイへのアイコンの追加/変更/削除
Private Sub IconTray(inPcture As PictureBox, dspMode As TSK_MODE, Optional inMsg As String = "")
  Dim nIcon    As NOTIFYICONDATA
  Dim lngRetValue As Long
  Dim lngAddDel  As Long
  
  With nIcon
    .hwnd = inPcture.hwnd
    .uID = 0
    .cbSize = Len(nIcon)
    
    Select Case dspMode
      Case TSK_ADD, TSK_UPDATE
        .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        .uCallbackMessage = WM_MOUSEMOVE  'hwndで指定されたオブジェクトハンドルを持つ、マウスムーブイベントにイベントを流す
        .hIcon = inPcture.Picture
        .szTip = inMsg & vbNullChar
        If dspMode = TSK_ADD Then
          lngAddDel = NIM_ADD
        ElseIf dspMode = TSK_UPDATE Then
          lngAddDel = NIM_MODIFY
        End If
          
      Case TSK_DEL
        lngAddDel = NIM_DELETE
    End Select

    lngRetValue = Shell_NotifyIcon(lngAddDel, nIcon)
  End With
End Sub
    • good
    • 0
この回答へのお礼

反応遅れてしまいすいません。
補足しようと思ったら、サンプルまで書いていただいてしまって(^^;
NOTIFYICONDATAでのタスクへの追加、削除などに関しては問題無かったのですが、PictureBoxやFormを使うやり方、とても参考になりました。

プロセス監視とかのコードはわかりますので、WM_USER定数を調べて自分でやってみようと思います。どうもありがとうございました。

お礼日時:2001/11/14 00:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!