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

このQ&Aに関連する最新のQ&A

A 回答 (3件)

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




タスクの処理は様々方法がありますが、ばくの知ってるパターンは大きく分けて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

あっすいません。

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

情報をください。

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

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

    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QFY3/2006ってどういう意味?

決算資料や事業計画資料などでFYという標記がありますが
これはなにをしめすのでしょうか?
FY06.FY07とかだと06年とかを示すのでしょうが
FY3というと検討もつきません・・・

Aベストアンサー

FYとは、会計年度を意味するFiscal Yearの略称です。

 多分、3は御社の3年度目という意味だと思いますが、3年度目でなかったら2006年度3月という意味で使っているかもしれません。

QVBでタスクバーアイコンの数を取得するには?

visual basic 2008 Express Editionを使用しています。

タスクアイコンの数を変数として持つには、どのようなコードを書けばよいでしょうか。

Aベストアンサー

取得したい物と違っているかも知れませんが一度下記を試して見て下さい。

Private Sub Button1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles Button1.Click
  Dim localProcAll As System.Diagnostics.Process() = System.Diagnostics.Process.GetProcesses()
  Dim p As System.Diagnostics.Process
  For Each p In localProcAll
    If p.MainWindowHandle <> IntPtr.Zero Then
      Debug.Print(p.ProcessName & " " & p.MainWindowTitle)
    End If
  Next
End Sub

QTZR50R(4EU)にTDR50のエンジン(3FY)

このあたりのバイクのエンジンは乗せ代え可能と聞いたんですが、4EUのフレームに3FYのエンジンは乗りますか?また、載らない場合、3FYのエンジンが乗るフレームを教えていただけると助かります。

よろしくお願いします。

Aベストアンサー

RZ→DT/RZ→TDR/TDR→DTなどの載せ替えはやったことありますが、TZRにTDRのエンジンを載せた変えたことはありませんので参考までに・・・。

DT50、RZ50など、などには載せ替え可能ですしここら辺のものは基本エンジンの形が変っていないため、載せ替えだけなら、ボルトオンでいけるとおもいます。

しかし4EUは確か12Vで、3FYは6Vだったかな・・・。電装関係の問題。
またラジエタホースの取り回しや、チェーンラインのライン出しなど面倒な所が多々あるかも・・・。です。
参考までに
http://dt50world.fan-site.net/tsubakuro/
http://www8.ocn.ne.jp/~mechalas/garage/tzr50.html

カスタムがんばってください。

Qハードディスクを開こうとダブルクリックしても開けない。

以前からハードディスクはよく使用していて、普通に使えていました。

ですが、今日『マイ コンピューター』からハードディスクを開こうとダブルクリックしたのですが、『ファイルを開くプログラムの選択』というものがでてきてしまいます。

おかしいと思い右クリックをしてみたところ、以前は一番上に少し太めの文字で『開く』となっていたものが、今は『Auto』となっています。

このままではハードディスクを開くために毎回右クリックしてから開くを押すというかたちになってしまうようで・・・

かなり困っています。ぜひ救いの手をお願いします。

Aベストアンサー

板違いです。
おそらく、このまま待っていても
誰も相手にしてくれません。
締め切ってから引っ越しましょう

QFY10PやFY11AのPやAは何の略?

会計年度を表すFY10PやFY11AのPやAは何の略か教えてください。

Aベストアンサー

 今、出かける前で時間がなく、かつ今回の質問への答ではないのですが、o/sについて昨夜書き込もうとしているところで締め切られましたので、そっちの方の質問でひょっとしたら…と思ったことを書き込みます。

 略語はケース・バイ・ケースでいろいろな使われ方がされます。o/sがB/Lで使われているということでしたが、相手科目でu/sというものがありませんか?相手科目ですから必ずしもB/LだけでなくP/Lにあるかも知れません。

 もしそうでしたら、それはoverstatedだと思います。既に仕訳されていた一定の取引について、誤計上または会計基準の変更などで再仕分けが必要になっているような場合、誤計上された修正すべき取引の額をo/sで明記します。そして本来計上されるべき勘定科目のところはu/s=understatedとしてその額が明記されます。

 取り急ぎ補足まで。

Qタスクバーのアイコンについて

VBでプログラムを作成しています。
タスクバーにアイコンを表示させて、そのアイコンをクリックするとメニューが表示されるようにしました。それで、メニューが表示されて後でメニュー以外のところをマウスでクリックするとメニューが消えるようにしたいのでその方法を教えてください。(VB上だとできるのですがWindowsのディスクトップ上だとできないのでWindowsのディスクトップ上で消える方法を教えてください。)

Aベストアンサー

PopupMenuの前にSetForegroundWindowするとOK

Q年の前に付くFY 例FY2003のFYとは?

FYの意味や正式な言い方
日本語で同じ物はあるのでしょうか?
どなたかご存知の方おしてください

Aベストアンサー

「fiscal year」または「financial year」の事です。
日本語では「会計年度」「課税年度」に相当します。
日本で「平成15年度」が「H15年4月~H16年3月」を表すのと同じで、1月1日から始まらない「年度」を表します。

Q右クリック、ダブルクリックの操作

勤務表作成してます。
A1に「ON・OFF」を表示します。
「ON」のときに、ダブルクリックで、上のセルを表示、右クリックで「1」を表示します。
「OFF」のときは、コンテキストメニュ-(通常の操作)が出来るようにしたいのですが、ON.OFFの切り替え操作のVBAがわかりません。
よろしくお願いします。
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

' ActiveCell = ActiveCell.Offset(-1, 0).Value
'
' If Target = Range("$A$1") Then
' Cancel = True

If Range("$A$1").Value = "イベントON" Then
Range("$A$1").Value = "イベントOFF"
Else
Range("$A$1").Value = "イベントON"
ActiveCell = ActiveCell.Offset(-1, 0).Value
Exit Sub
End If

Cancel = True
If Range("$A$1").Value = "イベントOFF" Then
Exit Sub
End If
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

'ActiveCell = "1"
' If Target = Range("$A$1") Then
' Cancel = True

' If Range("$A$1").Value = "イベントON" Then
' Range("$A$1").Value = "イベントOFF"
If Range("$A$1").Value = "イベントON" Then
ActiveCell = "1"

Else: Range("$A$1").Value = "イベントOFF"
Exit Sub
End If
Cancel = True

If Range("$A$1").Value = "イベントOFF" Then
Exit Sub
End If
End Sub

勤務表作成してます。
A1に「ON・OFF」を表示します。
「ON」のときに、ダブルクリックで、上のセルを表示、右クリックで「1」を表示します。
「OFF」のときは、コンテキストメニュ-(通常の操作)が出来るようにしたいのですが、ON.OFFの切り替え操作のVBAがわかりません。
よろしくお願いします。
Option Explicit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

' ActiveCell = ActiveCell.Offset(-1, 0).Value
'
' If Target = Range("$A$1") Then
' ...続きを読む

Aベストアンサー

ON.OFFの切り替えが知りたいの?

http://qanda.rakuten.ne.jp/qa4948485.html
の、方は締め切った方がいいと思うよ
良く見れば違うけど、質問部分は同じだし
「マルチポスト」になると思う

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$A$1" Then
Select Case Target.Value
Case "イベントON"
Target.Value = "イベントOFF"
Case "イベントOFF"
Target.Value = "イベントON"
End Select
Cancel = True
Exit Sub
End If
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$A$1" Then
Select Case Target.Value
Case "イベントON"
Target.Value = "イベントOFF"
Case "イベントOFF"
Target.Value = "イベントON"
End Select
Cancel = True
Exit Sub
End If
End Sub

ON.OFFの切り替えが知りたいの?

http://qanda.rakuten.ne.jp/qa4948485.html
の、方は締め切った方がいいと思うよ
良く見れば違うけど、質問部分は同じだし
「マルチポスト」になると思う

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Address = "$A$1" Then
Select Case Target.Value
Case "イベントON"
Target.Value = "イベントOFF"
Case "イベントOFF"
Target.Value = "イベントON"
End Select
Cancel = True
Exit Sub
End If
End Sub...続きを読む

Qオシロスコープ 「fy=ny/nx×fx」で発振周波数が求まるわけを教えてください。

今、オシロスコープの事を調べていて「fy=ny/nx×fx」で発振周波数が求まると書いてあります。
でもどうして上の公式で発振周波数が求まるのかが分かりません。
どなたか教えてもらえないでしょうか??

Aベストアンサー

nx:ny = fx:fyが成り立つから、

nx×fy = ny×fx

よって、fy = ny/nx × fx

QExcelVBAでフォームのタイトルバーで右クリックした場合などに閉じるボタンが有効化されないようにするコード

Excelのプログラムで、最小化ボタンを有効にし、閉じるボタンを無効にする質問をしたんですが、うまくいったと思ったのですがフォームが開き、タイトルバーで右クリックした場合などは閉じるボタンが有効化されてしまうのでこれを無効のままにするコードを教えてください。
作ったプログラムは以下の通りです。

標準モジュール
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long

Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Public Declare Function DrawMenuBar Lib "user32" _
(ByVal hWnd As Long) As Long

Public Declare Function GetSystemMenu Lib "user32.dll" _
(ByVal hWnd As Long, ByVal bRevert As Long) As Long

Public Declare Function EnableMenuItem Lib "user32" _
(ByVal hMenu As Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long

Public Const MF_DISABLED = &H2&
Public Const GWL_STYLE = (-16)
Public Const WS_MINIMIZEBOX = &H20000
Public Const MF_BYCOMMAND = &H0&
Public Const SC_CLOSE = &HF060&
Dim hSysMenu As Long

UserForm_Initializeプロシージャ
Dim fRet As Long
Dim hWnd As Long
Dim fStyle As Long

hWnd = FindWindow("ThunderDFrame", "UserForm1")
fStyle = GetWindowLong(hWnd, GWL_STYLE)
fStyle = (fStyle Or WS_THICKFRAME Or WS_MINIMIZEBOX)
fRet = SetWindowLong(hWnd, GWL_STYLE, fStyle)
hSysMenu = GetSystemMenu(hWnd, 0)
EnableMenuItem hSysMenu, SC_CLOSE, MF_BYCOMMAND Or MF_DISABLED
fRet = DrawMenuBar(hWnd)

回答よろしくお願いします。

Excelのプログラムで、最小化ボタンを有効にし、閉じるボタンを無効にする質問をしたんですが、うまくいったと思ったのですがフォームが開き、タイトルバーで右クリックした場合などは閉じるボタンが有効化されてしまうのでこれを無効のままにするコードを教えてください。
作ったプログラムは以下の通りです。

標準モジュール
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Public Declare Function G...続きを読む

Aベストアンサー

こんにちは。
http://hanatyan.sakura.ne.jp/vbhlp/ibe_peke.htm
こちら参考にされると良いですね。

Public Declare Function DeleteMenu Lib "user32" ( _
                  ByVal hMenu As Long, _
                  ByVal nPosition As Long, _
                  ByVal wFlags As Long) As Long

Public Const MF_BYPOSITION = &H400&

上記追加し

'EnableMenuItem hSysMenu, SC_CLOSE, MF_BYCOMMAND Or MF_DISABLED
DeleteMenu hSysMenu, SC_CLOSE, MF_BYCOMMAND
DeleteMenu hSysMenu, 5&, MF_BYPOSITION

...ではないでしょうか。

PublicスコープではなくてFormモジュールのPrivateで完結させたほうが良いような気もしますが。
また、[Alt]+[F4]キーでの終了にも対応させるなら下記も必要ではないでしょうか。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If CloseMode = vbFormControlMenu Then Cancel = True
End Sub

#と、以前紹介したリンク先に書いてありましたね。
#参考情報はよく読み、理解された上でお使いになられたほうが良いですよ。

こんにちは。
http://hanatyan.sakura.ne.jp/vbhlp/ibe_peke.htm
こちら参考にされると良いですね。

Public Declare Function DeleteMenu Lib "user32" ( _
                  ByVal hMenu As Long, _
                  ByVal nPosition As Long, _
                  ByVal wFlags As Long) As Long

Public Const MF_BYPOSITION = &H400&

上記追加し

'EnableMenuItem hSysMenu, SC_CLOSE, MF_BYCOMMAND Or MF_DISABLED
DeleteMenu hSysMe...続きを読む


人気Q&Aランキング

おすすめ情報