使用SendMessage讓程式Restore |
答題得分者是:jimmy_and_you
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
我的程式執行後用TrayIcon最小化,當在一次執行程式後偵測到程式已經處於執行的狀態將後來執行的程式關閉,並將一開始執行的程式Restore,我想用SendMessage來讓已經執行的程式restore但是在站上找了很多的文章我還是不知道該如何使用< >< >請知道的大大告知一下吧!我已經弄了很久了一直弄不出來才決定發表這篇文章...謝謝了^^
HANDLE mutex; LPSECURITY_ATTRIBUTES lpMutexAttributes; mutex=CreateMutex(NULL,true,"TForm1"); if(GetLastError()!=ERROR_ALREADY_EXISTS) { //程式執行... } else { HWND hWndParent; hWndParent= FindWindow(0, "線上收音機"); 接下來就不知道該怎麼寫了 } >> |
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
既然已經用Mutex,
就不要用FindWindow繞一大圈關閉原來開啟的程式。
在FormCreat中加入下面這段程式即可。
HANDLE hMutex; if (OpenMutex(MUTEX_ALL_ACCESS, FALSE,"MutexName")) // 檢查MutexName這個Mutex是否已經存在。 { ExitProcess(0); // 如果存在, 關閉程式。 } hMutex = CreateMutex(NULL, FALSE, "MutexName"); // 如果不存在, 新增MutexName的Mutex。這可以防止同一支程式重複執行。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Anpinos Middle Earth http://anpino.hp.infoseek.co.jp/ ------------------------------- 發表人 - anpino 於 2004/05/24 08:53:02 |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
我之前有用MUTEX 跟 PostMessage來實作過,大致的程式碼如下:
引言: //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR Arguments, int) { HANDLE mutex = CreateMutex(NULL, false, "TestMutex"); DWORD error = GetLastError(); if(error == ERROR_ALREADY_EXISTS && mutex!=NULL ) { HANDLE TheSame; if( (TheSame=FindWindow("TForm1","Form1"))!=NULL ) { PostMessage( TheSame, // handle of destination window 0x1700, // message to send 0, // first message parameter 0 // second message parameter ); } return 0; } /* 中間這段是原來的程式碼 : : : : */ if(mutex!=NULL) CloseHandle(mutex); return 0; } //--------------------------------------------------------------------- |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
引言: 既然已經用Mutex, 就不要用FindWindow繞一大圈關閉原來開啟的程式。 在FormCreat中加入下面這段程式即可。可能我沒說明清楚,我用來防止程式重複執行是用Mutex,FindWindow是我以為可以用來傳送訊息給已經執行的程式所以我才用FindWindow的,我現在是不知道怎麼把原先執行的程式restoreHANDLE hMutex; if (OpenMutex(MUTEX_ALL_ACCESS, FALSE,"MutexName")) // 檢查MutexName這個Mutex是否已經存在。 { ExitProcess(0); // 如果存在, 關閉程式。 } hMutex = CreateMutex(NULL, FALSE, "MutexName"); // 如果不存在, 新增MutexName的Mutex。這可以防止同一支程式重複執行。 ------------------------------- 發表人 - anpino 於 2004/05/24 08:53:02 |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
GGL兄:
我把我完整的程式碼POST出來供你做參考,也許不是最佳做法,不過應該可以達到你的要求 < class="code">
//project1.cpp
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
HANDLE mutex = CreateMutex(NULL, false, "TestMutex");
DWORD error = GetLastError(); if(error == ERROR_ALREADY_EXISTS && mutex!=NULL )
{
HANDLE TheSame;
if( (TheSame=FindWindow("TForm1","Form1"))!=NULL )
{
PostMessage(
TheSame, // handle of destination window
0x1700, // message to send
0, // first message parameter
0 // second message parameter
);
}
return 0;
} /* 中間這段是原來的程式碼
:
:
:
:
*/ if(mutex!=NULL)
CloseHandle(mutex);
return 0;
} //---------------------------------------------------------------------------
//unit1.cpp
void __fastcall TForm1::FormCreate(TObject *Sender)
{
WindowProc = MyWndProc;
}
void __fastcall TForm1::MyWndProc(TMessage &Message)
{
if (Message.Msg == 0x1700/*The Same window message*/)
{
//take the window to top
ShowWindow(Handle, SW_SHOW );
SetForegroundWindow(Handle);
ShowWindow(Application->Handle, SW_SHOW );
SetForegroundWindow( Application->Handle );
} WndProc(Message); //執行原來的 message function
}
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
|
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
|
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
引言: GGL:我剛剛試過這一段CODE沒問題,我想問題可能出在你在測試的時候沒把BCB關掉,導致你送出去的Message由BCB的Layout開發Form1接收去了,而不是正在執行的Form1;這個問題我之前也發生過,所以你可以試試把BCB關掉後是否正常WORK. >>< face="Verdana, Arial, Helvetica"> 原程式視窗會Restore但也會LOCK住,再把CODE改一下void __fastcall TForm1::MyWndProc(TMessage &Message) { if (Message.Msg == 0x1700/*The Same window message*/) { //take the window to top TrayIcon1->Restore(); } WndProc(Message); //執行原來的 message function }不好意思...常POST錯 |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
先結案給你鼓勵一下吧^^
但是我還是有問題ㄝ...
以下是我用來測試的程式碼,應該是這樣沒錯吧。麻煩了,謝謝
Unit1.cpp //--------------------------------------------------------------------------- #include |
jimmy_and_you
初階會員 發表:20 回覆:74 積分:33 註冊:2003-05-12 發送簡訊給我 |
引言: 先結案給你鼓勵一下吧^^ 但是我還是有問題ㄝ... 以下是我用來測試的程式碼,應該是這樣沒錯吧。麻煩了,謝謝我測試一切正常ㄟ,不知道你隱藏那一段CODE,所以不知道問題出在哪裡,我試著寫一段CODE測試 ,記得喔測試的時候要把BCB關掉...Unit1.cpp //--------------------------------------------------------------------------- #include //--------------------------------------------------------------------------- void __fastcall TForm1::MyWndProc(TMessage &Message) { if (Message.Msg == 0x1700/*The Same window message*/) { //take the window to top TrayIcon1->Restore(); ShowWindow(Application->Handle, SW_SHOW); Application->Restore(); ShowWindow(Handle, SW_SHOW); } WndProc(Message); //執行原來的 message function } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { WindowProc = MyWndProc; //隱藏用 Application->Minimize();//隱藏用 ShowWindow(Application->Handle, SW_HIDE); } //--------------------------------------------------------------------------- |
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
|
GGL
資深會員 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |