不同的message传给WPARAM, LPARAM的意义不同,你要发送什么message?

解决方案 »

  1.   

    一般来说传的应该是指针
    WPARAM是字参数,可以是一些整数,如id
    LPARAM是长参数,应该是指针
    我看过的是这样的,有待验证
      

  2.   

    WORD i;i = 100;SendMessage(WM_XXXX,wPARAM i,lPARAM &i );前者传数值,后者传指针要注意: SendMessage是可以跨进程操作的, 在向其他进程窗口发消息时要小心
      

  3.   

    TO masterz()  : 不同的message传给WPARAM, LPARAM的意义不同
       问:有哪几类消息?WP,LP各有哪几类意义?TO stoneyrh && CHK ,
    你们的解释我似乎明白,然后我传递了一个int类型的,也成功。
       问:
         1。为什么wparam是穿数值,lparam是传指针? 我查了一下msdn他们的定义不是一样么?
         2。这2个参数是否只能用来传递简单类型?譬如chat int....,因为当我试图传一个Cstring类型的时候,发生了错误。等待你们的回答,谢谢
      

  4.   

    例如:
     CString strValue;
     Sendmessage(WM_XXXX,(WPARAM)(&strValue)); 地址传过去就可以了
    在OnXXXX里
    {
       CString& strValue = *((CString*)lParam);
    ...
    }
      

  5.   

    WPARAM = UINT => DWORD ,UNSIGNED INT ? =>LPARAM IS THE SAME,
    YOU ARE ALL PARAMETERS OF MESSAGE,if you use this#define WM_MYMESSAGE   WM_USER+10000then 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);
              
      

  6.   

    ChK() :
    "要注意: SendMessage是可以跨进程操作的, 在向其他进程窗口发消息时要小心 "你說得有點誤導了! 跨进程的操作應該使用WM_COPYDATA等相關的IPC(Inter-process communication)的方法才可以的。在SendMessage()中的WPARAM和LPARAM, 可以傳數值也可以傳地址,並沒有這樣子的規定的。
    因為你在傳地址的時候,實際上已經把變量的地址改變為數值了。如 :
    int iVar = 100;
    DWORD dwAddres = (DWORD)&iVar;SendMessage(hwnd, message, dwAddres, 0);
      

  7.   

    关于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. 
      

  8.   

    就第一個問題,因為我沒有在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隻能傳遞數值。。
      

  9.   

    bluekite老兄, 你好!
    看来你真是个认真的人啊, 我觉得我们俩说的没什么矛盾的地方啊?
    因为他问用SendMessage发指针的问题, 所以我才提醒, 如果在进程之间发消息, 
    就要注意, 指针一般是不能随意用的, 如果要传大块数据, 当然要用老兄说的
    WM_COPYDATA消息,
    甚至,有的MFC对象连跨线程(同一进程内)都有问题,如DAO等,对于这样的
    东西,就算在同一进程,也不能简单传个指针了事。老兄为什么用繁体字,是不是台湾的?以后希望多流,哈哈
      

  10.   

    你总是半夜上网?其实我不算是正规的程序员, 只能是个杂家, 什么都搞,
    主要农业方面的计算机应用我有个主页, 有兴趣请来看看:
    http://jwsg.yeah.netcrazyingmouse, 不好意思, 我们把你的主题换成聊天了 ;-)
      

  11.   

    謝謝你。。crazyingmouse()通常都是這樣的時間上網的。。因為都是比較晚回家的。剛剛去了你的主頁,像你所說的,你的懂的東西蠻多的嘛。。呵呵
      

  12.   

    bluekite你好!
    这几天忙得够呛, 好几天没来上网了,我今晚就回老家过春节,

    春节愉快,还有crazyingmouse,给你先拜年了 ;-)
      

  13.   

    谢谢,谢谢!也祝CHK新春愉快。