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

利用 BCB 擷取 VB 程式訊息的問題........

 
nieo
一般會員


發表:32
回覆:56
積分:17
註冊:2003-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-09-29 10:04:18 IP:210.66.xxx.xxx 未訂閱

各位大大請問一下;

小弟是 WIN-API 的新手,想要用BCB寫一個簡單的程式去擷取VB程式所丟出來的訊息,VB裡面是用SendMessage()這個函式丟訊息出來,請問各位大大:小弟寫了一段程式碼,在button的onclick()事件下,當我按下按鍵就會去擷取VB丟出來的訊息,程式碼如下:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int msg;
MSG *lpMsg;
if(GetMessage(lpMsg,"VBpmrkl1.vbp",0,0) == true)
msg = lpMsg->message;
Edit1->Text = msg;
}

因為小弟是新手.....,所以不知道說是不是有什麼地方沒有宣告或是定義,都抓不到訊息,而且都會有錯誤訊息

Access violation at 77DF6996 in module 'user32.dll' .Read of address 00750046

請各位大大解惑!謝謝!

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-09-29 13:35:39 IP:61.229.xxx.xxx 未訂閱

你好,
你原本那樣的寫法是不正確的,請參考下help檔裡的程式:

#define CM_CHANGECOLOR (WM_APP 400) //改成你的自定訊息
class TMyControl : public TControl // 對你來說這裡是TForm1

{
protected:
void __fastcall CMChangeColor(TMessage &Message);

BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(CM_CHANGECOLOR, TMessage, CMChangeColor)
END_MESSAGE_MAP(TControl) //把TControl 換成TForm

};

void __fastcall TMyControl::CMChangeColor(TMessage &Message)

{
Color = Message.LParam; // set color from long parameter
TControl::CMChangeColor(Message); // call the inherited message handler
}

因為要解說上面程式的來龍去脈不是很簡單,請自己查相關的資料。

蕭沖 qs.xiao@gmail.com
http://aftcast.blogspot.com/
生有涯而知無涯,以有涯隨無涯,殆矣

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
nieo
一般會員


發表:32
回覆:56
積分:17
註冊:2003-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-09-29 15:28:07 IP:210.66.xxx.xxx 未訂閱

不好意思再麻煩大大.......

請問大大有好的介紹 WINAPI 的網站或著書嗎?可以推薦一下嗎?因為小弟對 WINAPI 沒有基本的概念.......,看了大大貼的程式碼後,也去參考BCB的help檔,可是還是沒有什麼概念..........

nieo
一般會員


發表:32
回覆:56
積分:17
註冊:2003-07-25

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-10-03 09:49:53 IP:210.66.xxx.xxx 未訂閱

請問大大:

當我將

BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_COPYDATA,TMessage,OnCopyData)
END_MESSAGE_MAP(TForm)

這一段程式碼設定在.h裡面,然後再FORM裡面加上這一段函式:

void __fastcall TForm1::OnCopyData(TMessage &Msg)
{
PCOPYDATASTRUCT pcp;
pcp = (PCOPYDATASTRUCT)Msg.LParam;
char* TraceMsg;
TraceMsg = (char*)pcp->lpData;
Memo1->Lines->Add(TraceMsg);
}

小弟想要做一個BUTTON來控制這段程式碼,但是要傳進去這個OnCopyData函式的TMessage參數要如何宣告,是說我只要宣告了一個TMessage型態的物件,他就會自動指到MSG MAP嗎?還是有另外的處理方法?請好心的大大解答一下!

aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-10-12 12:18:43 IP:61.229.xxx.xxx 未訂閱
你好,
依據你一開始所講的需求,我猜測你要的應該是: 當你按了button一下才開始想要接收訊息。若沒有按則不處理。若是如此,你可以在
.h header 上

public:
bool RunFlag ; //加這行

在cpp上:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RunFlag = true;
}

修改你原來的程式:

void __fastcall TForm1::OnCopyData(TMessage &Msg)
{
if ( RunFlag) //如果有按button的情形
{
PCOPYDATASTRUCT pcp;
pcp = (PCOPYDATASTRUCT)Msg.LParam;
char* TraceMsg;
TraceMsg = (char*)pcp->lpData;
Memo1->Lines->Add(TraceMsg);
}
}
以上是我測你要的結果。若不是,就請把需求和想法講的更仔細些,才方便解決
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-04-26 8:08:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!