初めまして、サイと申します。
今現在メッセンジャーのメールを受信を作ると言う事で作成しております。
タスクトレイに決まったアイコンを表示するというのとポップアップメニューは呼び出せたので
すが、そのアイコンをダブルクリックした時に受信する為のダイアログボックスが呼び出せませ
ん。
デバッグ画面では当然動くのですが、EXEファイルの状態になると開かないです。
わかる方いらっしゃいましたら、どうかご教授お願いします。
ちなみに環境はWINDOWS2000でVC++5.0。
MFCは使用していません。
ソースを掲示してくれというのであれば掲示いたします。
> ソースを掲示してくれというのであれば掲示いたします。
提示してください。
ソースはこんな感じです。
ちょっと長いですが。
//タスクトレイにアイコン表示
if( !SetTasktrayIcon( g_hInstance, hWnd, &g_nid, 名称,
IDI_ICON1 ) ) return 1;
//シェル再起動のメッセージを登録
g_taskbarCreated = RegisterWindowMessage( TaskbarkCreated );
//メッセージループ
while( TRUE )
{
MSG msg;
if( GetMessage( &msg, NULL, 0, 0 ) <= 0 ) break;
TranslateMessage( &msg );
DispatchMessage( &msg );
}
//タスクトレイのアイコンを削除
Shell_NotifyIcon( NIM_DELETE, &g_nid );
return 0;
}
//受信する為の画面表示
LRESULT CALLBACK mainDlgProc(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
//メッセージの対応
//ここに呼び出すためのダイアログボックスの命令文を作成
HANDLE hCurInst;
switch( uMsg )
{
case WM_ICON_CLICK:
//タスクトレイのアイコンのメッセージ
switch( lParam )
{
case WM_RBUTTONDOWN:
//ポップアップメニュー表示
SetForegroundWindow( hWnd );
//↑ポップアップメニューが出てる時に別の場所を押したらメニューが消える
ShowPopup( hWnd );
break;
//左ダブルクリックでダイアログボックスを起動
case WM_LBUTTONDBLCLK:
DialogBox (hCurInst, MAIN, NULL, (DLGPROC)mainDlgProc);
return FALSE; //↑のプログラムでダイアログを表示する
break;
case WM_DESTROY:
PostQuitMessage(0);//プログラム終了
break;
}
default:
//シェルが死んで再起動した時
if( uMsg == g_taskbarCreated )
{
//タスクトレイにアイコン表示
if( !SetTasktrayIcon( g_hInstance, hWnd, &g_nid,
メール,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 );
}
//以降ポップアップを表示する為の命令文になります
こんな感じです。
現状からいいますとこのプログラムでタスクトレイにアイコンの表示はできるんですが左ダブル
クリックをした段階ではダイアログボックスが開かないという状態です。
書いてありませんがもうひとつこのプログラムに欠陥がありまして、CreateMailSlot作成する
事ができずフラッグも変な状態にもなってます。
問題が多いですが、違うだろと言う所を指摘して頂けると幸いです。
よろしくお願いします。
hCurInst は mainDlgProc が呼ばれるたびに初期化され、違う値が入りますが、これが
原因では無いでしょうか。
シャノンさん指摘有難うございます。
hCurInstの部分をNULLに変えてみた所開くようになりました。
ついでみたいで申し訳ないのですが、メールスロットについてで一度画面を閉じて再度立ち上げ
るとメールスロットが作れなくてエラーが出るのですがこれは何が原因なんでしょうか?
ちなみにプログラムはこんな感じです。
LRESULT CALLBACK mainDlgProc(HWND hDlg, UINT message, WPARAM wParam,
LPARAM lParam)
{
HICON hIcon;
BOOL bErr;
char szBuff[1024];
DWORD dwReaded;
DWORD dwNextSize, dwCount ;
LPSTR lpszComp,lpszData;
LRESULT lResult = ERROR_SUCCESS;
BOOL bResult;
HWND hInst;
int openFlg = FALSE;
switch (message) {
case WM_INITDIALOG:
hWndmain = hDlg;
hIcon = LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),
IMAGE_ICON,32,32,0);
SendMessage(hDlg,WM_SETICON,FALSE,(LPARAM)(HICON)hIcon);
hIcon = LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),
IMAGE_ICON,32,32,0);
SendMessage(hDlg,WM_SETICON,TRUE,(LPARAM)(HICON)hIcon);
//送信されたメールを受け取る為のスロット作成
hMailslot = CreateMailslot(
\\\\.\\mailslot\\slot1,
0,
MAILSLOT_WAIT_FOREVER,
NULL);
//受け取る為のスロットの値が同じだった場合にエラーを返す
if(hMailslot == INVALID_HANDLE_VALUE){
MessageBox(NULL,
CreateMailslotエラー, szAppName, MB_OK);
}
else{
SetWindowText(hWndmain,接続);
}
return TRUE;
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE) {
CloseHandle(hMailslot);
EndDialog (hDlg, TRUE);
return TRUE;
} else
return FALSE;
break;
case WM_COMMAND:
if ( wParam == IDC_ON ) {
openFlg = TRUE; //押された事によってアイコンが開き中身が見れる
bResult = GetMailslotInfo(
hMailslot,
0,
&dwNextSize,
&dwCount,
NULL);
//メールスロットの情報を取得
if (!bResult) {
return FALSE;
}
//メール取得の有無
if (dwNextSize == MAILSLOT_NO_MESSAGE) {
return FALSE;
}
ZeroMemory(szBuff, sizeof(szBuff));
bErr = ReadFile(
hMailslot,
szBuff,
sizeof(szBuff)-1,
&dwReaded,
NULL);
lpszComp = strtok(szBuff, ); //ここで送信者のホスト名を取得
lpszData = strtok(NULL, ");//NULL, );//ここで送信者のデータを取得
lstrcpy(szData, lpszData); //ここでデータをコピー(データ本文)
lstrcpy(szComp, lpszComp); //ここでデータをコピー(ホスト名)
SetDlgItemText(hWndmain,IDC_RXDATA,szData);//ここでデータをダイアログに
//セット(データ)
SetDlgItemText(hWndmain,IDC_COMP,szComp);//ここでデータをダイアログに
//セット(ホスト名)
return TRUE;
}
if ( wParam == IDCANCEL ) {
EndDialog ( hDlg, TRUE );
return TRUE;
}
break;
default: return FALSE;
}
return TRUE;
}
こうした方がいいと言うのがありましたらお願いします。
CreateMailSlotのリファレンスには
「指定された名前のメールスロットが既に存在している場合は、エラーになります。」
とあります。
提示されたコードからはhMailslotのスコープがどうなってるかわかりませんが
単純にCloseHandleできてないだけではないでしょうか?
> hCurInstの部分をNULLに変えてみた所開くようになりました。
おいおいそれでいいのカヨ。
SetTasktrayIcon には、ちゃんとインスタンスハンドルを渡しているんだから、同じも
のを渡すべきだと思うがなぁ。
> こうした方がいいと言うのがありましたらお願いします。
とりあえず、GetLastError でエラーコードを調べて、FormatMessage を使うなりエラー
ルックアップツールを使うなりして、原因を調べてみましょう。
> hIcon = LoadImage(hInst,MAKEINTRESOURCE(IDI_ICON1),
> IMAGE_ICON,32,32,0);
hInst の値は何かなー?
> case WM_SYSCOMMAND:
> if (wParam == SC_CLOSE) {
WM_CLOSE で処理すべきだと思う。
kureさん、シャノンさん指摘有難うございました。
指摘された場所を変えてみたら上手く動作するようになりました。
NULLで返しちゃいけませんよね、インスタンスハンドルを書いても動きました。
メールに関してもスロット自体がクローズされてなかったと言う状態で付け加えと訂正したら何
事もなく動くようになりました。
管理人の方重複メッセージを消して頂き有難うございます。
また何かありましたらよろしくお願いします。