線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1672
推到 Plurk!
推到 Facebook!

如何把一個按鈕映射到一個外部程式的表單上?

答題得分者是:m8815010
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-07 17:46:04 IP:222.135.xxx.xxx 未訂閱
各位先輩,我是一個BCB愛好者,最近迷戀用BCB操作外部程式,我現在可以隱藏和顯示記事本的按鈕,我現在想用Windows的API函數在記事本上添加一個按鈕,單擊後能執行指定的功能,但百思不得其解,因此寢室難安,請知道的前輩一定指教,要求有代碼,學生在此謝謝各位了,謝謝!
m8815010
版主


發表:99
回覆:372
積分:289
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-08 15:44:05 IP:61.63.xxx.xxx 未訂閱
引言: 各位先輩,我是一個BCB愛好者,最近迷戀用BCB操作外部程式,我現在可以隱藏和顯示記事本的按鈕,我現在想用Windows的API函數在記事本上添加一個按鈕,單擊後能執行指定的功能,但百思不得其解,因此寢室難安,請知道的前輩一定指教,要求有代碼,學生在此謝謝各位了,謝謝!
jean2004你好: 這一題和這篇有點像: < href="http://delphi.ktop.com.tw/topic.php?TOPIC_ID=71942">http://delphi.ktop.com.tw/topic.php?TOPIC_ID=71942 以一個記事本介面來說,它上面就3個元件了,一為menu、一為Edit、一為最下面的status bar,想要在上面加按鈕的話,大概只有加在menu或Edit上比較正常了! 我試著在Edit上加一個button並有自已的click事件,是可行的,精神同上述那篇中的內容,這裏我就不再贅述了,只是效果不如上述那篇好,可試需要再行加強之! 另外我試著加button進入menu中,其實這樣也就是加menuitem進入其menu中,發現是可以,但是這個menuitem的click事件一直加不進去,所以目前就只能加一個沒有功能的menuitem這樣而已!

~~    TForm1 *Form1;    WNDPROC OldBtnWndProc;
LRESULT CALLBACK BtnWndProc(HWND,UINT,WPARAM,LPARAM );    int i=0;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
LRESULT CALLBACK BtnWndProc(HWND hwnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{
 //if (hwnd==mybtn) {
     if (Msg==WM_LBUTTONDOWN)
         Form1->Caption=IntToStr(  i);
 //}     return CallWindowProc((FARPROC)OldBtnWndProc,hwnd,Msg,wParam,lParam);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 HWND hwnd=FindWindow(NULL,"未命名 - 記事本");
 HMENU hmenu=GetMenu(hwnd);
 HMENU mymenu=CreateMenu();
 AppendMenu(hmenu,MF_POPUP | MF_ENABLED | MF_STRING,(LONG)mymenu,"&我的測試(&T)");     HMENU smenu=GetSubMenu(hmenu,5);
 HMENU ssmenu=CreateMenu();
 AppendMenu(smenu,MF_ENABLED | MF_STRING,(LONG)ssmenu,"Do it...");     SendMessage(hwnd,WM_PAINT,0,0);
 BringWindowToTop(hwnd);     OldBtnWndProc=(WNDPROC)GetWindowLong((HWND)ssmenu,GWL_WNDPROC); //設定button的事件函式
 if (OldBtnWndProc==NULL)
     ShowMessage("擷取default window函式失敗!");     if (SetWindowLong((HWND)ssmenu,GWL_WNDPROC,(LONG)BtnWndProc)==0)
     ShowMessage("設定window函式失敗!");
}    
操作方式就是先開一個空的記事本出來,然後用本範例新增一個menuitem,那記事本是handle值就先直接用findwindow來找,因為只是for test! 至於事件無法植入成功,目前還不是很確定原因,大概還要try一下.... 目前結果大致就到這而已,劣法,請參著!
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-10 18:04:43 IP:222.135.xxx.xxx 未訂閱
m8815010前辈,我已测试前辈的代码,效果和先生所说的一样,先生真是高手呀,今后请多关照,谢谢!
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-10 20:17:24 IP:59.104.xxx.xxx 未訂閱
在Windows系統中,每個程式都有獨立的記憶體空間~ 要將事件放入本身程式以外的程式時,得使用注射的方法!將源碼載入到 其他的記憶體位址! 之前有使個使用CreateRemoteThread注射的範例 http://delphi.ktop.com.tw/topic.php?topic_id=51114
系統時間:2024-05-04 3:01:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!