TNB Library
TnbOnlyWindowChecker.h
[詳解]
1#pragma once
11#include "TnbStr.h"
12#include "TnbSync.h"
13
14
15
16//TNB Library
17namespace TNB
18{
19
20
21
60{
61public:
62
65 {
66 m_DeleteMutex();
67 }
68
73 COnlyWindowChecker(LPCTSTR lpszUniquelyText) : m_uniquelyText(lpszUniquelyText), m_pMutex(NULL)
74 {
75 }
76
85 bool IsOnly(HWND hWnd)
86 {
87 if ( hWnd == NULL || ! ::IsWindow(hWnd) || m_uniquelyText.IsEmpty() )
88 {
89 ASSERT0( false, "COnlyWindowChecker::IsOnly()", "パラメータの設定が不正です。" );
91 }
92 m_DeleteMutex();
93 m_pMutex = new CSyncMutex(true, m_uniquelyText + _T("_mx"));
94 if ( ! m_pMutex->Lock(0) )
95 {
96 // 誰か使っている
97 m_hWnd = hWnd;
98 ::EnumWindows(ms_EnumFunc, reinterpret_cast<LPARAM>(this));
99 return true;
100 }
101 // 初めて
102 VERIFY( ::SetProp(hWnd, m_uniquelyText, reinterpret_cast<HANDLE>(TRUE)) );
103 return false;
104 }
105
106protected:
107
113 virtual void OnFound(HWND hWnd)
114 {
115 if ( ::IsWindowVisible(hWnd) )
116 {
117 ::ShowWindow(hWnd, SW_SHOWNORMAL);
118 ::SetForegroundWindow(hWnd);
119 FLASHWINFO fi = { sizeof(FLASHWINFO) };
120 fi.hwnd = hWnd;
121 fi.dwFlags = FLASHW_ALL;
122 fi.uCount = 3;
123 fi.dwTimeout = 1000 / (3 * 2);
124 ::FlashWindowEx(&fi);
125 }
126 }
127
128private:
130 void m_DeleteMutex(void)
131 {
132 if ( m_pMutex != NULL )
133 {
134 delete m_pMutex;
135 m_pMutex = NULL;
136 }
137 }
139 BOOL m_EnumFunc(HWND hWnd)
140 {
141 if ( m_hWnd != hWnd )
142 {
143 HANDLE h = ::GetProp(hWnd, m_uniquelyText);
144 if ( h != NULL )
145 {
146 OnFound(hWnd);
147 return FALSE; // enum終わり
148 }
149 }
150 return TRUE;
151 }
153 static BOOL CALLBACK ms_EnumFunc(HWND hWnd, LPARAM lParam)
154 {
155 COnlyWindowChecker* P = reinterpret_cast<COnlyWindowChecker*>(lParam);
156 return P->m_EnumFunc(hWnd);
157 }
158
159 CSyncMutex* m_pMutex;
160 CStr m_uniquelyText;
161 HWND m_hWnd;
162};
163
164
165
166};//TNB
167
文字列管理関係のヘッダ
同期処理関係のヘッダ
virtual bool Lock(DWORD dwTime=INFINITE) const
[排他] ロック
Definition: TnbSync.h:91
[ETC] コピー不可能スーパークラス.
Definition: TnbDef.h:599
パラメータ不正例外
Definition: TnbException.h:159
オンリーウィンドウチェッカー.
~COnlyWindowChecker(void)
デストラクタ
virtual void OnFound(HWND hWnd)
[通知] 同じウィンドウ発見.
bool IsOnly(HWND hWnd)
[確認] チェック.
COnlyWindowChecker(LPCTSTR lpszUniquelyText)
コンストラクタ.
bool IsEmpty(void) const
[確認] 空チェック
Definition: TnbStr.h:528
Mutex排他管理クラス
Definition: TnbSync.h:273
TNB Library
Definition: TnbDoxyTitle.txt:2