关于 SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 )

crazyingmouse 2002-01-26 12:20:17
我想问的是,到底如何运用WPARAM,和LPARAM来传递参数。(数值和指针)

我参看了一下其他贴子,有网友说在调用Sendmessage时用强制转换。

例如: sendmessage(WM_XXXX,(WPARAM)m_a_struct_or_class);
但是,我试验了后,VC却说无法作相应的转换。
到底该如何利用这2个参数?

最好能给出简单的可行代码。意思我明白,就是编译从来没有通过 。
...全文
588 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazyingmouse 2002-02-06
  • 打赏
  • 举报
回复
谢谢,谢谢!

也祝CHK新春愉快。
ChK 2002-02-05
  • 打赏
  • 举报
回复
bluekite你好!
这几天忙得够呛, 好几天没来上网了,我今晚就回老家过春节,

春节愉快,

还有crazyingmouse,给你先拜年了 ;-)
bluekite 2002-02-02
  • 打赏
  • 举报
回复
其實以前是學什麼專業都沒有關系,隻要不是太過於抽象的東西而是實用性較強的,我想都可以使
用程序來令到我們所學的知識更有用處,更方便,這一點我想你是多點的心得的。

對了,那你應該是比較熟悉硬件方面的知識吧。
bluekite 2002-02-01
  • 打赏
  • 举报
回复
謝謝你。。crazyingmouse()

通常都是這樣的時間上網的。。因為都是比較晚回家的。

剛剛去了你的主頁,像你所說的,你的懂的東西蠻多的嘛。。呵呵
ChK 2002-02-01
  • 打赏
  • 举报
回复
我是农业院校毕业的, 但现在觉得好象还是最喜欢写程序, 写那些
我觉得用得着的程序
crazyingmouse 2002-01-31
  • 打赏
  • 举报
回复
非常乐意。
bluekite 2002-01-30
  • 打赏
  • 举报
回复
你去澳門的認識還不少嘛。。呵呵
的確是的,澳門無論在外地人的眼中還是在我們的眼中都是個旅遊休閒的好地方,有著賭場嘛。。
在這裡,做軟件的真的是很少,除了這裡的電信公司外,最多也是一些幫人寫寫網頁的小公司。
我們公司是香港的一個分公司,專門做“後勤”的。。也就是做一些他們那邊不好做的,或者講求
速度的元件和較為底層的東西。。

老兄,你也是做程序員的吧。。
你們都是做些什麼的啊。。說來聽聽。
說真的身處這邊環境就好像是井底之蛙似的,外面在做什麼都不大清楚。。
ChK 2002-01-30
  • 打赏
  • 举报
回复
你总是半夜上网?

其实我不算是正规的程序员, 只能是个杂家, 什么都搞,
主要农业方面的计算机应用

我有个主页, 有兴趣请来看看:
http://jwsg.yeah.net

crazyingmouse, 不好意思, 我们把你的主题换成聊天了 ;-)
ChK 2002-01-29
  • 打赏
  • 举报
回复
彼此彼此, 我也不是什么老手, C++爱好者而已
在我映象中, 澳门应该是个休闲的地方, 竟然还有做软件的,
难得难得!
bluekite 2002-01-29
  • 打赏
  • 举报
回复
呵呵,我是對事不對人的。。

其實也沒有什麼的,隻是因為在這裡有很多初學者,我是怕老兄你是其中之一。。。所以口水就多了一點點。。

看來你是個老手。。
哎呀。。孔子門前賣文章拉。。。見笑了。。

我不在台湾,我澳門。。
以後還請老兄您多多指教了。。
ChK 2002-01-28
  • 打赏
  • 举报
回复
bluekite老兄, 你好!
看来你真是个认真的人啊, 我觉得我们俩说的没什么矛盾的地方啊?
因为他问用SendMessage发指针的问题, 所以我才提醒, 如果在进程之间发消息,
就要注意, 指针一般是不能随意用的, 如果要传大块数据, 当然要用老兄说的
WM_COPYDATA消息,
甚至,有的MFC对象连跨线程(同一进程内)都有问题,如DAO等,对于这样的
东西,就算在同一进程,也不能简单传个指针了事。

老兄为什么用繁体字,是不是台湾的?以后希望多流,哈哈
ChK 2002-01-27
  • 打赏
  • 举报
回复
关于W,L传数值还是指针的问题:
因为WPARAM在16位系统时长度不够,无法传32位指针,所以说他是传数用的,当然32位
系统W也可传指针,但用L传指针语意明确一点, 只是编程习惯 ;-)

关于SendMessage, MSDN的说明如下:

If the specified window was created by the calling thread, the window procedure is called immediately as a subroutine. If the specified window was created by a different thread, the system switches to that thread and calls the appropriate window procedure. Messages sent between threads are processed only when the receiving thread executes message retrieval code. The sending thread is blocked until the receiving thread processes the message.
bluekite 2002-01-27
  • 打赏
  • 举报
回复
ChK() :
"要注意: SendMessage是可以跨进程操作的, 在向其他进程窗口发消息时要小心 "

你說得有點誤導了!

跨进程的操作應該使用WM_COPYDATA等相關的IPC(Inter-process communication)的方法才可以的。

在SendMessage()中的WPARAM和LPARAM, 可以傳數值也可以傳地址,並沒有這樣子的規定的。
因為你在傳地址的時候,實際上已經把變量的地址改變為數值了。

如 :
int iVar = 100;
DWORD dwAddres = (DWORD)&iVar;

SendMessage(hwnd, message, dwAddres, 0);
bluekite 2002-01-27
  • 打赏
  • 举报
回复
就第一個問題,因為我沒有在16位系統下編程的經驗,這個我還不知道,( w for word & l for long) 我同意你的說法,是習慣上的問題而已。

第二個關於SendMessage的問題。
你上面談到msdn上的說明和IPC無關的,
該說明是在說在單一線程使用SendMessage和多線程之間使用SendMessage的差異的,和有什麼地方要注意的。例如線程A SendMesasge給線程B,那線程A就要等線程B的處理完相應的工作才繼續下去 --> The sending thread is blocked until the receiving thread processes the message.

IPC 是進程相互之間的通訊。因為在Window的32位系統裡面,每個進程都有2^32 bytes大的單獨地址空間。不像Window3.1一樣所有的程序都使用同一塊地址空間,這樣子的話很可能因為系統中的某個程序發生錯誤而引起其它程序的錯誤。而在32位系統裡面(如上所說),就不會發生這樣子的事情了,因為大家都有一個單獨的地址空間。

如果使用SendMessage在進程之間進行通訊的話。
例如你在進程C發了一個整型變量的地址0x0012345過去進程D,但很可能進程D的地址空間裡面的0x0012345的地址是另外變量的或者還沒有被使用到,這樣子就有問題了。 所以除了用WM_COPYDATA外,在進程之間使用SendMessage隻能傳遞數值。。


ChK 2002-01-26
  • 打赏
  • 举报
回复
WORD i;

i = 100;

SendMessage(WM_XXXX,wPARAM i,lPARAM &i );

前者传数值,后者传指针

要注意: SendMessage是可以跨进程操作的, 在向其他进程窗口发消息时要小心
crazyingmouse 2002-01-26
  • 打赏
  • 举报
回复
感谢大家的回答,我明白了!
stoneyrh 2002-01-26
  • 打赏
  • 举报
回复
一般来说传的应该是指针
WPARAM是字参数,可以是一些整数,如id
LPARAM是长参数,应该是指针
我看过的是这样的,有待验证
masterz 2002-01-26
  • 打赏
  • 举报
回复
不同的message传给WPARAM, LPARAM的意义不同,你要发送什么message?
zhakewei 2002-01-26
  • 打赏
  • 举报
回复
WPARAM = UINT => DWORD ,UNSIGNED INT ? =>LPARAM IS THE SAME,
YOU ARE ALL PARAMETERS OF MESSAGE,if you use this

#define WM_MYMESSAGE WM_USER+10000

then in message loop;
case WM_MYMESSAGE:
switch ( LOWORD(wparam))
case a:
funa();
case b:
funb();
default:
func();
you can use lparam translate a pointer from you function to youe main loop;
ok then you can use SendMessage(hwnd,WM_MYMESSAGE,a, (LPARAM ) &YOUE STRUCTURE);

bskay 2002-01-26
  • 打赏
  • 举报
回复
up 3次
加载更多回复(2)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧