ShowNotifyWndNo.06256
ひろ さん 03/01/24 17:28
 
 皆さん今日は、ひろです。
 新設された ShowNotifyWnd に付いて質問があります。
 この関数を呼びだし後、設定時間内以内では、[OK], [キャンセル] のどち
らが押されたか調べて、処理を分岐したいときが有ります。この様なときどう
すればよいでしょうか? キーボード操作だけに限れば、次のマクロで出来るの
ですが、これではマウス操作が出来ない(;_;)。
##tmp = dllfunc( "ShowNotifyWnd", "新着の通知",
  "メールが届いています。メールを読みますか? );
##handle = dllfunc( "GetNotifyWnd" );
setactivehidemaru ##handle;//これでダイアログがアクティブに
##time = tickcount;
disablebreak;
##tab = 0;
while( 1 ){
  //keyboard の処理
  ##key = keypressed;
  if( ##key == 0x09 )##tab = ##tab^1;//[Tab]
  if( ##key == 0x1D || ##key == 0x20 ){//[Space] or [Enter]
    if( ##tab ){
      #tmp = dllfunc("HideNotifyWnd");
      goto ENDING;
    }
    else{
      #tmp = dllfunc("HideNotifyWnd");
      #tmp = dllfunc("RestoreWindow");
      break;
    }
  }
  if( ##key == 0x1B ){//[Esc]
    #tmp = dllfunc("HideNotifyWnd");
    goto ENDING;
  }
  //mouse の処理 (disablebreak 実行中なので無意味)
  if( !dllfunc( "GetNotifyWnd" )){
    if( dllfunc( "IsTuruKameMain" ) )break;
    else{
      goto ENDING;
    }
  }
  //時間切れの処理
  if( ##time + 10000 < tickcount ){
    goto ENDING;
  }
}

 マクロの実行に関わり無く ShowNotifyWnd がアクティブのまま (つまり
setactivehidemaru でアクティブ・ウィンドウの切り替え→マクロの実行もそ
ちらに移行、という操作が必要ない) か、ShowNotifyWnd に対しては、キー/
マウス操作がそのまま出来れる様に仕様が変われば回避できるのですが、現状
で回避できるよい方法は無いのでしょうか?

[ ]
RE:06256 ShowNotifyWndNo.06257
秀まるお さん 03/01/24 17:50
 
 通知ウィンドウが閉じるまでマクロをループするのは大変よろしくないです。
そもそもdisablebreakした状態だとメッセージループが一切回らない=キー入力
もマウス入力も一切受け付けないので、通知ウィンドウをユーザーが閉じること
すら出来ません。

 通知ウィンドウのどのボタンが押されたかで処理を振り分けるのはあきらめて
ください。

[ ]
RE:06257 ShowNotifyWndNo.06258
ひろ さん 03/01/24 18:08
 
 秀まるおさん今日は、ひろです。
> そもそもdisablebreakした状態だとメッセージループが一切回らない=キー入力
> もマウス入力も一切受け付けないので、通知ウィンドウをユーザーが閉じること
> すら出来ません。
 キー入力に関しては、keypressed で回避できたんですけど。

>  通知ウィンドウのどのボタンが押されたかで処理を振り分けるのはあきらめて
> ください。
 そうですか、どうやっても駄目なんですね。ShowNotifyWnd を使うことはあ
きらめます。

[ ]
RE:06258 ShowNotifyWndNo.06275
秀まるお さん 03/01/29 13:49
 
 ShowNotifyWndについて、またまた仕様変更が入ってしまいました。

 (既にひろさんから「使わない」となってますが…)

 手元のV2.36にて、「n通受信しました」のメッセージにOKかキャンセルしない
と「受信が一段落したら」用のマクロが実行されない仕様変更をしました。そう
したら今度は連鎖反応でShowNotifyWndの方も仕様変更となってしまいました。

 具体的には、ShowNotifyWndで通知ウィンドウを出すと、そこのメッセージに
OK/キャンセルした時にも「受信が一段落したら」用のマクロが自動実行されま
す。

 鶴亀メール内部では、ShowNotifyWndで出したのかそれとも受信動作によって
通知ウィンドウが出たのか分からない、あるいはその両方が複合したケースもあ
るということで、こういう仕様にせざるを得ません。

 ということで、もしShowNotifyWndを利用される場合はその辺ご注意、あるい
はその仕様を逆手にとって利用してください。

[ ]
RE:06275 ShowNotifyWndNo.06289
ひろ さん 03/02/03 23:29
 
 秀まるおさん今日は、ひろです。
>  手元のV2.36にて、「n通受信しました」のメッセージにOKかキャンセルしない
> と「受信が一段落したら」用のマクロが実行されない仕様変更をしました。そう
> したら今度は連鎖反応でShowNotifyWndの方も仕様変更となってしまいました。
>
>  具体的には、ShowNotifyWndで通知ウィンドウを出すと、そこのメッセージに
> OK/キャンセルした時にも「受信が一段落したら」用のマクロが自動実行されま
> す。
 ちょっと気になったのですが、ShowNotifyWnd の仕様の関係で、
loaddll "tkinfo.dll";
#tmp = dllfunc( "ShowNotifyWnd", "", "" );
freedll;
というマクロを、「受信が一段落した時」として指定していると、無限ループ
になります。確かに
loaddll "tkinfo.dll";
if( dllfunc( "Bypass_GetForegroundWindow" )
  == dllfunc( "MainWnd" ) )goto End;
#tmp = dllfunc( "ShowNotifyWnd", "", "" );
End:
  freedll;
等の対処をすれば良いのですが、今後この関数を使う人の参考として登録させ
ていただきました。

[ ]