全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2244
推到 Plurk!
推到 Facebook!

使用SendMessage讓程式Restore

答題得分者是:jimmy_and_you
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-24 04:30:41 IP:211.76.xxx.xxx 未訂閱
我的程式執行後用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-24 08:49:23 IP:211.23.xxx.xxx 未訂閱
既然已經用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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-24 09:57:50 IP:61.70.xxx.xxx 未訂閱
我之前有用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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-24 10:12:49 IP:61.70.xxx.xxx 未訂閱
Sorry剛剛按太快還按錯變成引言,忘了說明程式中還要針對Message 0x1700加以處理,做執行ShowWindow() PS:或許直接PostMessage 也可以,不過我不清楚哪個Message可以做到Restore的功能
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-24 12:28:58 IP:211.76.xxx.xxx 未訂閱
引言: 既然已經用Mutex, 就不要用FindWindow繞一大圈關閉原來開啟的程式。 在FormCreat中加入下面這段程式即可。
HANDLE 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
可能我沒說明清楚,我用來防止程式重複執行是用Mutex,FindWindow是我以為可以用來傳送訊息給已經執行的程式所以我才用FindWindow的,我現在是不知道怎麼把原先執行的程式restore
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-24 14:03:38 IP:203.70.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-24 14:44:14 IP:211.76.xxx.xxx 未訂閱
謝謝jimmy_and_you的解答... 但是我試了以後只能防止執行程式,而不能把程式Restoreㄝ... 是什麼原因呢?今天凌晨自己弄了很久想不到還是要靠別人解答,麻煩大大囉~ ps.我是用RzTrayIcon來把程式最小化...
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-24 14:54:11 IP:61.70.xxx.xxx 未訂閱
GGL:我剛剛試過這一段CODE沒問題,我想問題可能出在你在測試的時候沒把BCB關掉,導致你送出去的Message由BCB的Layout開發Form1接收去了,而不是正在執行的Form1;這個問題我之前也發生過,所以你可以試試把BCB關掉後是否正常WORK.
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-24 15:24:47 IP:61.70.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-24 18:59:17 IP:211.76.xxx.xxx 未訂閱
先結案給你鼓勵一下吧^^ 但是我還是有問題ㄝ... 以下是我用來測試的程式碼,應該是這樣沒錯吧。麻煩了,謝謝
Unit1.cpp
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
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
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  WindowProc = MyWndProc;
}
//---------------------------------------------------------------------------    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;
        }
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);                     Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        if(mutex!=NULL)
           CloseHandle(mutex);            return 0;
}
jimmy_and_you
初階會員


發表:20
回覆:74
積分:33
註冊:2003-05-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-25 13:58:38 IP:203.70.xxx.xxx 未訂閱
引言: 先結案給你鼓勵一下吧^^ 但是我還是有問題ㄝ... 以下是我用來測試的程式碼,應該是這樣沒錯吧。麻煩了,謝謝
Unit1.cpp
//---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
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
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  WindowProc = MyWndProc;
}
//---------------------------------------------------------------------------    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;
        }
        try
        {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);                     Application->Run();
        }
        catch (Exception &exception)
        {
                 Application->ShowException(&exception);
        }
        catch (...)
        {
                 try
                 {
                         throw Exception("");
                 }
                 catch (Exception &exception)
                 {
                         Application->ShowException(&exception);
                 }
        }
        if(mutex!=NULL)
           CloseHandle(mutex);            return 0;
}
我測試一切正常ㄟ,不知道你隱藏那一段CODE,所以不知道問題出在哪裡,我試著寫一段CODE測試 ,記得喔測試的時候要把BCB關掉...
 
//---------------------------------------------------------------------------
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-25 15:37:52 IP:211.76.xxx.xxx 未訂閱
我沒有隱藏任何的code,那是全部的程式碼,我只有用一個簡單的視窗來測試就不行了,測試的時候我也有關掉BCB。真是奇怪^^"
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-25 15:58:35 IP:211.76.xxx.xxx 未訂閱
我把你post出來的程式碼整個貼到我的程式測試了一下,結果如下圖 最小化前: 最小化後: 只是工具列上程式的顯示不見了,但是桌面上還是有那個程式在,而沒有最小化到右下角那個區域裡面,我想會不會是你誤會我的意思了。 我的程式是在按最小化後縮小到右下角時鐘那裡,而且在桌面上都看不到程式;當我重複執行這個程式的時候,他會把之前執行過在右下角那個地方的程式Restore,就像是一開始執行尚未最小化那樣...謝謝
系統時間:2024-05-02 10:30:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!