Правильно отображая подсказку воздушного шара лотка в PowerShell

Короткая версия: Я думаю, что нуждаюсь в помощи с надлежащим использованием событий в PowerShell, которые вызываются в результате сообщения Windows для избавлений от значка подсказки воздушного шара.

Долгая версия:

У меня есть продолжительная команда PowerShell (сборка), что я хотел бы быть уведомленным, когда она завершает с помощью подсказки воздушного шара в системном лотке / область уведомлений.

Я смог создать сценарий Записи-BalloonTip (ниже) этого, делает примерно, что я хочу. Единственная проблема состоит в том, что, как иногда происходит со значками панели задач, значок панели задач не исчезает пока я мышь по нему. Путем многократного использования той же глобальной переменной для представления NotifyIcon я могу снова использовать этот сценарий и сохранить его так, чтобы только один значок системного лотка остался (пока я мышь по нему). Это все еще чувствует себя подобно взлому. Я пытался добавить обработчик событий так, чтобы он был уведомлен относительно события BalloonTipClosed и затем избавился от него там. В конечном счете обработчик, я попробовал все три метода, которые я видел предложенный для того, чтобы избавиться от непрекращающегося значка напрасно.

Раздражающая часть то, что простое .Dispose кажется, работает над последующими вызовами сценария, ведя меня, чтобы думать, что блок сценария события не называют вообще.

Я проверил, что BalloonTipClosed называют после того, как подсказка исчезает в отдельном приложении WinForms.

Я пропускаю что-то основное? Любая справка очень ценится.Спасибо!

Вот код для "Записи-BalloonTip.ps1":

param
(
    $text,
    $title = "",
    $icon = "Info",
    $timeout=15000
)

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | out-null

if ($global:writeBalloonTipIcon)
{
    # This gets rid of the previous one
    $global:writeBalloonTipIcon.Dispose()
}

$global:writeBalloonTipIcon = new-object System.Windows.Forms.NotifyIcon 
$global:writeBalloonTipIcon.Icon = [System.Drawing.SystemIcons]::Information

# FIXME: This *should* cleanup the icon after it's done, but it doesn't seem to work
$global:writeBalloonTipIcon.add_BalloonTipClosed(
  {
    # this *should* work, but it's not. What am I missing?
    $global:writeBalloonTipIcon.Icon = $null; 
    $global:writeBalloonTipIcon.Visible = $false; 
    $global:writeBalloonTipIcon.Dispose();
  });

$global:writeBalloonTipIcon.Visible = $true;
$global:writeBalloonTipIcon.ShowBalloonTip($timeout, $title, $text, $icon);

8
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

Думаю, этот код необходимо выполнить в потоке STA. PowerShell (v2 показан здесь) по умолчанию выполняется в потоке MTA:

PS U:\> [System.Threading.Thread]::CurrentThread


ManagedThreadId    : 5
ExecutionContext   : System.Threading.ExecutionContext
Priority           : Normal
IsAlive            : True
IsThreadPoolThread : False
IsBackground       : False
ThreadState        : Running
ApartmentState     : MTA
CurrentUICulture   : en-US
CurrentCulture     : en-US
Name               : Pipeline Execution Thread
2
ответ дан 6 December 2019 в 00:57
поделиться
float InvSqrt (float x){
  float xhalf = 0.5f*x;
  int i = *(int*)&x;
  i = 0x5f3759df - (i>>1);
  x = *(float*)&i;
  x = x*(1.5f - xhalf*x*x);
  return x;}

Это мой любимый быстрый квадратный корень. На самом деле, это обратная квадратному корню, но вы можете инвертировать его после, если вы хотите.... Я не могу сказать, если это быстрее, если вы хотите квадратный корень, а не обратный квадратный корень, но это холодно просто так же.
http://www.beyond3d.com/content/articles/8/

-121--4566415-

Я бы рекомендовал использовать Register-ObjectEvent для подписки на событие BallingTipClosed. Это произошло недавно в другой публикации SO . Попробуйте.

1
ответ дан 6 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: