タスクトレイに残ったアイコンを消すには?

解決


elp  2009-02-10 03:51:06  No: 101564

Private Declare Function CreateProcess Lib "kernel32" _
       Alias "CreateProcessA" ( _
       ByVal lpApplicationName As String, _
       ByVal lpCommandLine As String, _
       lpProcessAttributes As Any, _
       lpThreadAttributes As Any, _
       ByVal bInheritHandles As Long, _
       ByVal dwCreationFlags As Long, _
       lpEnvironment As Any, _
       ByVal lpCurrentDriectory As String, _
       lpStartupInfo As STARTUPINFO, _
       lpProcessInformation As PROCESS_INFORMATION _
       ) As Long

で起動させたプログラムを

Private Declare Function TerminateProcess Lib "kernel32" ( _
       ByVal hProcess As Long, _
       ByVal uExitCode As Long _
       ) As Long

で強制終了させると
アイコンがタスクトレイに残ったままの状態になってしまいます。
(マウスカーソルをそのアイコンにかざすと消えますが・・・)
プログラム処理で消すことは出来ないでしょうか。
よろしくお願いします。


オショウ  2009-02-10 04:03:17  No: 101565

可能性だけ・・・

マウスをかざすと消えると言うことは、何かイベントが発生して
リフレッシュ?される為、無効なアイコン表示がなくなる。

と思います。

よって、プログラムで擬似的にその動作を発生させれば、無くな
るかと。

※  それより強制終了させないといけないことを改善させれば、
    そんなことしなくて済むのでは?

以上。


elp  2009-02-10 06:09:03  No: 101566

オショウさん、早速のレスありがとうございます。

プラットフォームSDKのSetCursorPosを使うということですね。
チョットやってみます。
他に何かありましたら引き続きよろしくお願いします。

>それより強制終了させないといけないことを改善させれば・・・

一連の自動処理で、動作がおかしくなったプログラム(他社)を再起動させて正常な動作に戻したいために強制終了が必要な訳なんです。


elp  2009-02-10 08:03:48  No: 101567

SetCursorPosでやってみました。
タスクバーのプロパティが「タスクバーを固定する」の場合はマウスのカーソルを動かして消すことが出来ましたが、
「タスクバーを自動的に隠す」に設定した状態ですと、ダメですね。
何とか隠れたタスクバーを表示させる方法があれば一応OKなんですが・・・


オショウ  2009-02-12 06:11:35  No: 101568

タスクバーを自動的に隠すの設定でやってみました

まず、タスクトレイのウィンドウハンドルを正しく取れれば、
SetCursorPosで、タスクトレイの領域にマウスポインタが移動
した瞬間、隠れたタスクバーがせり上がり表示されました。

ただし、隠れた状態のままでウィンドウの位置を取得している
ので、そのままでは位置が変わってしまっているのでダメです。

ここで難儀なのは、せりあがる動作中の時間を待って、表示後
に再度正しく位置を取得すると言うところでしょう。

次にタスクバーが固定の状態と同じくSetCursorPosでマウスポ
インタを移動させてみましたが・・・残念ながら期待した結果
にはなりませんでした。

何か動作が不足しているようです。

タスクトレイ上をマウスポインタが走ってしまうので、いまい
ちなんですが・・・なんとかなるような気がします。

タスクバーのウィンドウハンドルを使って、フォーカスを当て
た後、実験してみるとか、試せる内容はまだ残っているように
思います。

以上。参考まで


elp  2009-02-12 07:50:31  No: 101569

オショウさん、いろいろとありがとうございました。
下記のようにしたら出来るようになりました。

'マウスのポインター移動
Public Declare Function SetCursorPos Lib "user32" _
(ByVal x As Long, ByVal y As Long) As Long

Private Sub Command1_Click()
Dim a As Long
Dim x As Long
Dim y As Long
Dim x1 As Long
Dim y1 As Long
Dim n As Long
Dim T As Single
Dim T1 As Single

x1 = Screen.Width
y1 = Screen.Height

'カーソルの位置をワクの隅に設定
x = x1 / Screen.TwipsPerPixelX
y = (y1 - 10) / Screen.TwipsPerPixelY
a = SetCursorPos(x, y)

T1 = Timer
Do 'タイマーを入れる(重要)
T = Timer - T1
DoEvents
Loop Until T > 0.5

For n = 1 To 30 'アニメーション化
    x = (x1 - 100 * n) / Screen.TwipsPerPixelX
    y = y1 * 0.98 / Screen.TwipsPerPixelY
    a = SetCursorPos(x, y)
    T1 = Timer
    Do 'タイマーを入れる(重要)
        T = Timer - T1
        DoEvents
    Loop Until T > 0.05
Next n
End Sub


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加