タスクトレイに格納してある状態でメールを受け取ったら自動表示

[戻る]
サイ 2006/05/15(月) 09:20:26
タスクトレイにある状態で相手からメールを受け取ったら受信すると言う方法がよく解りませ
ん。
自分なりに考えて相手からメール内容を受け取ったら出力すると言う部分をアイコンの所に書い
てもみましたが、上手く起動しませんでした。

FOR文でまわして出力すると言う方法もあるらしくそれも試しても反応せず。
どなたかわかる方いらっしゃいましたらご教授お願いします。

環境は相変わらずWINDOWS2000でVC++5.0当然MFCは使ってません。

シャノン 2006/05/15(月) 09:33:43
前回と同じですが、書いてあるコードを提示していただかないと、返答のしようがあり
ません。

サイ 2006/05/15(月) 10:00:30
失礼しました。
コードなんですが、自分が作ったタスクトレイ内のコードはこんな感じです。

〜〜〜〜〜〜〜〜上はダイアログボックスについての命令文〜〜〜〜〜〜〜〜〜
//メッセージの対応
LRESULT CALLBACK WinProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
    
    switch( uMsg )
    {
 
    case WM_ICON_CLICK:
        
        //タスクトレイのアイコンのメッセージ
        switch( lParam )
        {
        
        //左ダブルクリックでダイアログボックスを起動
    case WM_LBUTTONDBLCLK:
         DialogBox (g_hInstance, "MAIN", NULL, (DLGPROC)mainDlgProc);
         return TRUE;        
        
       //右ボタンを一度押された時に表示する
    case WM_RBUTTONDOWN:

         //ポップアップメニュー表示
    SetForegroundWindow( hWnd );
    //↑ポップアップメニューが出てる時に別の場所を押したらメニューが消える
         ShowPopup( hWnd );
         break;

    case WM_DESTROY:

    PostQuitMessage(0);    //プログラム終了
    break;

    }

         default:

        //シェルが死んで再起動した時
        if( uMsg == g_taskbarCreated )
        {
        //タスクトレイにアイコン表示
        if( !SetTasktrayIcon( g_hInstance, hWnd, &g_nid, 
                             "IPメッセンジャー",IDI_ICON1 ) ) 
            PostQuitMessage(0);
        }
    }
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}

//タスクトレイにアイコンを登録
BOOL SetTasktrayIcon( HINSTANCE hInstance, HWND hWnd, NOTIFYICONDATA *nid, 
LPCTSTR lpszTitle, const int nIconID )
{
    wsprintf( nid->szTip, lpszTitle );
    nid->cbSize           = sizeof( NOTIFYICONDATA );
    nid->hIcon            = LoadIcon( hInstance, MAKEINTRESOURCE( nIconID ) );
    nid->hWnd             = hWnd;
    nid->uCallbackMessage = WM_ICON_CLICK;
    nid->uFlags           = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    return Shell_NotifyIcon( NIM_ADD, nid );
  return FALSE;
〜〜〜〜〜ここにダイアログを呼び出す為のIF文?〜〜〜〜〜

}
〜〜〜〜〜〜〜以下ポップアップメニュー作成する命令文〜〜〜〜〜〜〜〜

タスクトレイにアイコンが作成されるときの後にメールスロットにメールが来たらダイアログを
出力すると言うような方法を取って送信側からメールを送ってみたのですが出ずでした。

シャノン 2006/05/15(月) 13:23:15
> 自分なりに考えて相手からメール内容を受け取ったら出力すると言う部分を
> アイコンの所に書いてもみましたが、上手く起動しませんでした。

このコードが無いようですが…。

> タスクトレイにアイコンが作成されるときの後にメールスロットに
> メールが来たらダイアログを出力すると言うような方法を取って
> 送信側からメールを送ってみたのですが出ずでした。

ひょっとしたら「メールスロット」に関する勘違いがあるんじゃないでしょうか?
CreateMailslot で作る「メールスロット」は、低レベルのプロセス間通信の仕組みで
す。
Outlook Express なんかで扱う「電子メール」を扱うためのものではありません。
「送信側からメールを送った」というのは、「メールスロットに WriteFile でデータを
書き込んだ」という意味ですか?
電子メールを送っても、メールスロットには何も届きませんよ。

サイ 2006/05/15(月) 13:46:13
たびたびすみません。
書いたIF文の位置としては
//タスクトレイにアイコンを登録
BOOL SetTasktrayIcon( HINSTANCE hInstance, HWND hWnd, NOTIFYICONDATA *nid, 
LPCTSTR lpszTitle, const int nIconID )
{
    wsprintf( nid->szTip, lpszTitle );
    nid->cbSize           = sizeof( NOTIFYICONDATA );
    nid->hIcon            = LoadIcon( hInstance, MAKEINTRESOURCE( nIconID ) );
    nid->hWnd             = hWnd;
    nid->uCallbackMessage = WM_ICON_CLICK;
    nid->uFlags           = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    return Shell_NotifyIcon( NIM_ADD, nid );
  return FALSE;
  
  //↓が自分で考えて書いた場所
   if(hMailslot > 0){ 
      DialogBox (g_hInstance, "MAIN", NULL, (DLGPROC)mainDlgProc);
      return TRUE;

}

この状態では当然ながら起動はしないです。
hMailslotに値が入った時に出力すると思ったのでこうしてみたんですが・・・・。

送信側でWriteFileして受信側がReadFileで読み込む状態です。

シャノン 2006/05/15(月) 14:11:01
せめてコンパイルエラーにならないコードを載せてください…

> この状態では当然ながら起動はしないです。

何を指して「起動しない」と言っていますか?
プログラムは起動するはずです。

まぁ、

>     return Shell_NotifyIcon( NIM_ADD, nid );
>   return FALSE;

の2行(2行目は意味が無い)によって、その位置まで行かないので、実行されません
が。

> hMailslotに値が入った時に出力すると思ったのでこうしてみたんですが・・・・。

これを素直に解釈すると、「hMailslot の値が 0 より大きいとき」なので、
CreateMailslot に成功していれば if 文の条件は満たされますね。
メールスロットにデータが届いても、hMailslot の値は全く変化しません。

猫でも分かるプログラミング
http://www.kumei.ne.jp/c_lang/
の、第250〜258章あたりに、メールスロットの使い方が載っています(全部実践する
と、立派なチャットプログラムができます)。
このあたりを読んでみてはいかがでしょうか。

サイ 2006/05/15(月) 14:46:21
シャノンさんいつも有難うございます。

教えて頂いたHPを参考にしてみたいと思います。

サイ 2006/05/15(月) 14:58:37
訂正なのですが、起動しないと言うのはプログラムが動かないのではなくメールスロットにデー
タが来た時に呼び出して画面を出力すると言うのが動作しないと言う意味です。

古いスレッドには追加発言できません。