//-------------------------------------------------------------------------------- // //【スモールアイコンのハンドル取得】 //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// { // IDI_ICONは求めたいアイコンのリソースID // hInstはアイコンリソースのあるインスタンスハンドル HICON hIconSmall = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, 0) ; }
//-------------------------------------------------------------------------------- // //【タスクバーにアイコンを表示させない】 //(SDK) ///////////////////////////////////////////////////////////////////////////// // WinMain()内のウィンドウ作成部分 { // ウィンドウの作成時にWS_EX_TOOLWINDOWを指定する。 HWND hWnd = CreateWindowEx(WS_EX_TOOLWINDOW | …,……) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { // ウインドウの拡張スタイルをツールウインドウとして作成させる cs.dwExStyle |= WS_EX_TOOLWINDOW ; return CFrameWnd::PreCreateWindow(cs) ; } //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// { // 目的のウィンドウを一旦消す ShowWindow(hWnd, SW_HIDE) ; // 拡張ウィンドウスタイルの取得 LONG lExStyle = GetWindowLong(hWnd, GWL_EXSTYLE) ; // WS_EX_TOOLWINDOWの指定 lExStyle |= WS_EX_TOOLWINDOW ; // 新しい拡張ウィンドウスタイルの設定 SetWindowLong(hWnd, GWL_EXSTYLE, lExStyle) ; // ウィンドウを表示する ShowWindow(hWnd, SW_SHOWNORMAL) ; }
//-------------------------------------------------------------------------------- // //【アイコンのままで開かなくするには】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ウィンドウプロシージャ内のWM_QUERYOPENメッセージ処理部分 { case WM_QUERYOPEN: { return 0; } } (//MFC) ///////////////////////////////////////////////////////////////////////////// // クラスウィザードで追加されたWM_QUERYOPENハンドラ //※WM_QUERYOPENが一覧に表示されない場合は、クラス情報タブのメッセージ //フィルタで「Windows」を選択すれば良い CMainFrame::OnQueryOpen() { return 0; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // クラスウィザードで追加されたWM_SHOWWINDOWハンドラ void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus) { CFrameWnd::OnShowWindow(bShow, nStatus); // ウインドウをアイコン化する ShowWindow(SW_SHOWMINNOACTIVE) ; }
//-------------------------------------------------------------------------------- // //【拡張子に対応したアイコンの取得】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // void OnTest(HWND hWnd) { OPENFILENAME ofn ; char szFileName[MAX_PATH] ; szFileName[0] = '\0' ; ZeroMemory((LPVOID)&ofn, sizeof(OPENFILENAME)) ; ofn.lStructSize = sizeof(OPENFILENAME) ; ofn.hwndOwner = hWnd ; ofn.lpstrFilter = "全てのファイル(*.*)\0*.*\0\0" ; ofn.lpstrFileTitle = szFileName ; ofn.nMaxFileTitle = MAX_PATH ; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER ; if(GetOpenFileName(&ofn)){ SHFILEINFO shfi ; // ラージアイコンの取得 SHGetFileInfo(szFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON) ; g_hIconLarge = shfi.hIcon ; // ショートカット矢印付きのアイコン取得 SHGetFileInfo(szFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LINKOVERLAY) ; g_hIconLink = shfi.hIcon ; // スモールアイコンの取得 SHGetFileInfo(szFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON) ; g_hIconSmall = shfi.hIcon ; // アイコンを描画させるために再描画の指定 InvalidateRect(hWnd, NULL, TRUE) ; } } ///////////////////////////////////////////////////////////////////////////// // ダイアログプロシージャ内のWM_PAINTハンドラ部分 LRESULT CALLBACK TestDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_PAINT: PAINTSTRUCT ps; HDC hdc; hdc = BeginPaint(hDlg, &ps) ; // g_hIconLarge,g_hIconLink,g_hIconSmallはHICON型のグローバル変数 // ラージアイコンの描画 DrawIcon(hdc, 5, 5, g_hIconLarge) ; // ショートカット矢印付きのアイコン描画 DrawIcon(hdc, 45, 5, g_hIconLink) ; // スモールアイコンの描画 DrawIconEx(hdc, 85, 5, g_hIconSmall, 16, 16, 0, NULL, DI_NORMAL) ; EndPaint(hDlg, &ps) ; return TRUE ; default : break ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// void CTestDialog::OnTest() { CString strFileName ; SHFILEINFO shfi ; CFileDialog dlg(TRUE,"","", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "全てのファイル(*.*)|*.*||",this) ; // オープンファイルダイアログでファイルを指定 if(dlg.DoModal() == IDOK){ strFileName = dlg.GetPathName() ; // ラージアイコンの取得 SHGetFileInfo(strFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LARGEICON) ; m_hIconLarge = shfi.hIcon ; // ショートカット矢印付きのアイコン取得 SHGetFileInfo(strFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_LINKOVERLAY) ; m_hIconLink = shfi.hIcon ; // スモールアイコンの取得 SHGetFileInfo(strFileName, FILE_ATTRIBUTE_ARCHIVE, &shfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_SMALLICON) ; m_hIconSmall = shfi.hIcon ; // アイコンを描画させるために再描画の指定 Invalidate() ; } } ///////////////////////////////////////////////////////////////////////////// // WM_PAINTハンドラ void CTestDialog::OnPaint() { CPaintDC dc(this) ; // 描画用のデバイス コンテキスト // m_hIconLarge,m_hIconLink,m_hIconSmallはHICON型のメンバ変数 // ラージアイコンの描画 dc.DrawIcon(5, 5, m_hIconLarge) ; // ショートカット矢印付きのアイコン描画 dc.DrawIcon(45, 5, m_hIconLink) ; // スモールアイコンの描画 DrawIconEx(dc.m_hDC, 85, 5, m_hIconSmall, 16, 16, 0, NULL, DI_NORMAL) ; }
//-------------------------------------------------------------------------------- // //【アイコンをシステムトレイに表示させる】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // 自前のメッセージ番号を定義(100には特に意味はない) #define NOTIFY_TRAYICON (WM_APP + 100) // トレイアイコン管理用IDを定義(1には特に意味はない) #define TRAY_ID 1 // Shell_NotifyIcon()用構造体の宣言 NOTIFYICONDATA g_nid ; ///////////////////////////////////////////////////////////////////////////// // メインウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_CREATE : // システムトレイにアイコンを追加 ZeroMemory(&g_nid, sizeof(NOTIFYICONDATA)) ; g_nid.cbSize = sizeof(NOTIFYICONDATA) ; g_nid.hWnd = hWnd ; g_nid.uID = TRAY_ID ; g_nid.uFlags = NIF_ICON | NIF_MESSAGE ; g_nid.uCallbackMessage = NOTIFY_TRAYICON ; // IDC_ICONはアイコンのリソースID g_nid.hIcon = (HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0) ; Shell_NotifyIcon(NIM_ADD, &g_nid) ; return 0 ; // トレイアイコン用メッセージ処理 case NOTIFY_TRAYICON : if(wParam == TRAY_ID){ switch(lParam){ case WM_LBUTTONDOWN : { // 左クリックされた時の処理 MessageBeep(0) ; break ; } default : break ; } } return 0 ; case WM_DESTROY : // 登録したアイコンの削除 Shell_NotifyIcon(NIM_DELETE, &g_nid) ; PostQuitMessage(0) ; return 0 ; default : break ; } return (DefWindowProc(hWnd, message, wParam, lParam)) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// //[MainFrm.h] ///////////////////////////////////////////////////////////////////////////// // 自前のメッセージ番号を定義(100には特に意味はない) #define NOTIFY_TRAYICON (WM_APP + 100) // トレイアイコン管理用IDを定義(1には特に意味はない) #define TRAY_ID 1 class CMainFrame: public CFrameWnd { : // 生成されたメッセージ マップ関数 protected: // Shell_NotifyIcon()用構造体の宣言 NOTIFYICONDATA m_nid ; // メッセージ処理用関数宣言 afx_msg LONG OnTrayIcon(WPARAM wParam, LPARAM lParam) ; : } ///////////////////////////////////////////////////////////////////////////// //[MainFrm.cpp] ///////////////////////////////////////////////////////////////////////////// // メッセージマップの追加 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) //}}AFX_MSG_MAP ON_MESSAGE(NOTIFY_TRAYICON, OnTrayIcon) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // WM_CREATEハンドラ CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { : : // システムトレイにアイコンを追加 ZeroMemory(&m_nid, sizeof(NOTIFYICONDATA)) ; m_nid.cbSize = sizeof(NOTIFYICONDATA) ; m_nid.hWnd = m_hWnd ; m_nid.uID = TRAY_ID ; m_nid.uFlags = NIF_ICON | NIF_MESSAGE ; m_nid.uCallbackMessage = NOTIFY_TRAYICON ; // IDC_ICON1はアイコンのリソースID m_nid.hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0) ; Shell_NotifyIcon(NIM_ADD, &m_nid) ; return 0 ; } ///////////////////////////////////////////////////////////////////////////// // メッセージ処理関数 LONG CMainFrame::OnTrayIcon(WPARAM wParam, LPARAM lParam) { if(wParam == TRAY_ID){ switch(lParam){ case WM_LBUTTONDOWN: // 左クリックされた時の処理 break ; default : break ; } } return 0 ; } ///////////////////////////////////////////////////////////////////////////// // WM_DESTROYハンドラ void CMainFrame::OnDestroy() { // 登録したアイコンの削除 Shell_NotifyIcon(NIM_DELETE, &m_nid) ; CFrameWnd::OnDestroy() ; }
//-------------------------------------------------------------------------------- // //【システムトレイのアイコンをアニメーションさせる】 //(SDK) ///////////////////////////////////////////////////////////////////////////// // タイマIDを定義(100には特に意味はない) #define TIMER_ID 100 // アニメーション用のアイコンハンドル HICON g_hIcon1 = NULL ; HICON g_hIcon2 = NULL ; ///////////////////////////////////////////////////////////////////////////// // メインウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_CREATE : // アニメーション用のアイコンをあらかじめ読み込んでおく // g_hIcon1,g_hIcon2はHICON型のグローバル変数 g_hIcon1 = (HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0) ; g_hIcon2 = (HICON)LoadImage(g_hInstance, MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 16, 16, 0) ; // システムトレイにアイコンを追加 ZeroMemory(&g_nid, sizeof(NOTIFYICONDATA)) ; g_nid.cbSize = sizeof(NOTIFYICONDATA) ; g_nid.hWnd = hWnd ; g_nid.uID = TRAY_ID ; g_nid.uFlags = NIF_ICON | NIF_MESSAGE ; g_nid.uCallbackMessage = NOTIFY_TRAYICON ; g_nid.hIcon = g_hIcon1 ; Shell_NotifyIcon(NIM_ADD, &g_nid) ; // システムトレイのアイコンをアニメーションさせるためにタイマを起動 SetTimer(hWnd, TIMER_ID, 1000, NULL) ; return 0 ; case WM_TIMER : // アイコンを切り替える if(g_nid.hIcon == g_hIcon1){ g_nid.hIcon = g_hIcon2 ; } else{ g_nid.hIcon = g_hIcon1 ; } // アイコンの変更 Shell_NotifyIcon(NIM_MODIFY , &g_nid) ; return 0 ; case WM_DESTROY : // タイマの削除 KillTimer(hWnd, TIMER_ID) ; // 登録したアイコンの削除 Shell_NotifyIcon(NIM_DELETE, &g_nid) ; PostQuitMessage(0) ; return 0 ; default : break ; } return (DefWindowProc(hWnd, message, wParam, lParam)) ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// //[MainFrm.cpp] ///////////////////////////////////////////////////////////////////////////// // タイマIDを定義(100には特に意味はない) #define TIMER_ID 100 ///////////////////////////////////////////////////////////////////////////// // WM_CREATEハンドラ CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { : : // アニメーション用のアイコンをあらかじめ読み込んでおく // m_hIcon1,m_hIcon2はHICON型のメンバ変数 m_hIcon1 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON1), IMAGE_ICON, 16, 16, 0) ; m_hIcon2 = (HICON)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON2), IMAGE_ICON, 16, 16, 0) ; // システムトレイにアイコンを追加 ZeroMemory(&m_nid, sizeof(NOTIFYICONDATA)) ; m_nid.cbSize = sizeof(NOTIFYICONDATA) ; m_nid.hWnd = m_hWnd ; m_nid.uID = TRAY_ID ; m_nid.uFlags = NIF_ICON | NIF_MESSAGE ; m_nid.uCallbackMessage = NOTIFY_TRAYICON ; m_nid.hIcon = m_hIcon1 ; Shell_NotifyIcon(NIM_ADD, &m_nid) ; // システムトレイのアイコンをアニメーションさせるためにタイマを起動 SetTimer(TIMER_ID, 1000, NULL) ; return 0 ; } ///////////////////////////////////////////////////////////////////////////// // WM_TIMERハンドラ void CMainFrame::OnTimer(UINT nIDEvent) { // アイコンを切り替える if(m_nid.hIcon == m_hIcon1){ m_nid.hIcon = m_hIcon2 ; } else{ m_nid.hIcon = m_hIcon1 ; } // アイコンの変更 Shell_NotifyIcon(NIM_MODIFY , &m_nid) ; //CFrameWnd::OnTimer(nIDEvent); } ///////////////////////////////////////////////////////////////////////////// // WM_DESTROYハンドラ void CMainFrame::OnDestroy() { // タイマの削除 KillTimer(TIMER_ID) ; // 登録したアイコンの削除 Shell_NotifyIcon(NIM_DELETE, &m_nid) ; CFrameWnd::OnDestroy() ; }