当然可以了,句柄一般用FindWindow得到

解决方案 »

  1.   

    可以直接通过线程ID发线程消息
    PostThreadMessage(          DWORD idThread,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
    );
      

  2.   

    FindWindow,通过标题或者类名得到句柄。
    给这个句柄PostMessage
      

  3.   

    FindWindow对于没有Form窗体的程序(列入控制台程序),也能获得它的句柄吗?
      

  4.   

    PostThreadMessage 没有窗体也能通信,消息本来就是发给线程的
      

  5.   

    PostThreadMessage 没有窗体也能通信,消息本来就是发给线程的
    ==================================================================
    但是一般而言没友窗体的线程是米有消息队列的,就是“没有路,怎么能走呢”
      

  6.   

    对于这部分内容我不太熟悉。
    我试着使用FindWindow去获得一个控制台进程的handle,
    但是返回值总是0。各位兄弟姐妹,能给点有权威的回答吗,
    利用PostMessage等API进行没有窗体的进程之间的通信,
    到底能行还是不能行,我也好有个数。
      

  7.   

    CWnd类也不一定非有窗体啊
    ========================================
    是么?那CWnd的成员变量m_hWnd取什么值呢????
      

  8.   

    控制台进程是没有窗口的,没有窗口就不能用PostMessage或SendMessage。
    以上两个发消息的函数都是与HWND相关的,即必须有窗口句柄,才能发消息。
    若要想线程发消息,用PostThreadMessage,需要知道线程的id,并且线程有消息循环
      

  9.   

    先谢楼上的。
    使用PostThreadMessage的话,如何能知道接受者的线程的id呢?
      

  10.   

    HANDLE WINAPI CreateThread(
      LPSECURITY_ATTRIBUTES lpThreadAttributes,
      SIZE_T dwStackSize,
      LPTHREAD_START_ROUTINE lpStartAddress,
      LPVOID lpParameter,
      DWORD dwCreationFlags,
      LPDWORD lpThreadId-------------线程ID
    );
      

  11.   

    GetCurrentThreadId()可以获取到另外一个进程的线程吗?
      

  12.   

    两个进程定义相同的自定义消息名,当A进程发消息给B进程时,先通过FindWindow找到B进程的句柄,然后再根据句柄利用PostMessage把自定义的消息名发送过去就行了。和普通的发送消息一样,B进程要做相关的操作才能接收消息(自定义消息、消息映射,消息处理函数)。
      

  13.   

    如果你是想做进程通信的话,可以利用共享内存去做啊,那个方便一点。另外还有一个DataCopy。
    这两个到网上查一下,就可以得到一些资料
      

  14.   

    LZ的问题很矛盾啊,想知道另一个进程的某一个线程ID,又没有什么标志符可以区分?
    如果有多个控制台,那么LZ需要的到底是哪一个?
    这就像去找人一样,不知道对方姓名、年龄、性别、样貌、身材、服饰,如果去找?
    失散多年的母子相聚,好歹还有个胎记可以区分一下。
    LZ必须先确定一个唯一的标志,然后再来让对方通过这个标志找到它!
      

  15.   

    得到自己的告诉别人 你如何描述另外一个线程,线程姓名?
    --------------------------------
    可以得到自己的id,但怎么去告诉别人呢。
    现在想问的是:
    PostThreadMessage如何进行两个进程之间的通信?
      

  16.   

    LZ:要是你问能不能,无论SendMessage/PostMessage/PostThreadMessage都可以做进程间通信,但是这个做起来有太多细节了,真的不能这样问下去
      

  17.   

    谢谢大家,各位提供的帮助对我来说都很有用。
    因为以前没学习过,所以一些问题可能问的很无知,而且也没什么时间磨刀(笑)。再总结一下问题:
    目前要实现两个没有窗体的后台进程之间的通信,并且非得要用Win32API中的函数来完成,如何弄?
      

  18.   

    要做有很多条件,首先通信双方都必须精细设计,以提供彼此通信支持
    其次,你自己必须定义通信协议,包括怎么告诉对方等答案
    “创建一个不可视的窗口”应该是比较简单而可行的方法,其他方法都比这个要复杂,在你没有时间去磨刀的情况下,还是选择他,否则我真怀疑你几个月内能不能搞明白
    用不可见窗口,通过RegisterWindowMessage定义系统级的消息
    通过消息映射来处理对于你,应该是唯一可行的
      

  19.   

    进程通信方法可就多了这里就有11种:0。剪贴板Clipboard: 在16位时代常使用的方式,CWnd中提供支持1。窗口消息 标准的Windows消息以及专用的WM_COPYDATA消息 SENDMESSAGE()接收端必须有一个窗口2。使用共享内存方式(Shared Memory)
       a.设定一块共享内存区域           
         HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES, DWORD, DWORD, DWORD,  LPCSTR) 
         产生一个file-mapping核心对象
         LPVOID MapViewOfFile(
             HANDLE hFileMappingObject,
             DWORD  dwDesiredAcess,
             DWORD  dwFileOffsetHigh,
             DWORD  dwFileOffsetLow,
             DWORD  dwNumberOfBytesToMap
         );
        得到共享内存的指针
       b.找出共享内存
        决定这块内存要以点对点(peer to peer)的形式呈现
            每个进程都必须有相同的能力,产生共享内存并将它初始化。每个进程
            都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的
            错误代码是ERROR_ALREADY_EXISTS,那么进程就可以假设这一共享内存区         域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己 排在第          一位,并接下来将共享内存初始化。
        还是要使用client/server架构中
           只有server进程才应该产生并初始化共享内存。所有的进程都应该使用HANDLE OpenFileMapping(DWORD dwDesiredAccess,
                                       BOOL bInheritHandle,
                                       LPCTSTR lpName);
            再调用MapViewOfFile(),取得共享内存的指针
       c.同步处理(Mutex)
       d.清理(Cleaning up) BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);
                            CloseHandle()3。动态数据交换(DDE)通过维护全局分配内存使的应用程序间传递成为可能
       其方式是再一块全局内存中手工放置大量的数据,然后使用窗口消息传递内存    指针.这是16位WIN时代使用的方式,因为在WIN32下已经没有全局和局部内存    了,现在的内存只有一种就是虚存。   4。消息管道(Message Pipe)
       用于设置应用程序间的一条永久通讯通道,通过该通道可以象自己的应用程序
       访问一个平面文件一样读写数据。
       匿名管道(Anonymous Pipes)
           单向流动,并且只能够在同一电脑上的各个进程之间流动。
       命名管道(Named Pipes)
           双向,跨网络,任何进程都可以轻易的抓住,放进管道的数据有固定的格        式,而使用ReadFile()只能读取该大小的倍数。
           可以被使用于I/O Completion Ports5   邮件槽(Mailslots)
        广播式通信,在32系统中提供的新方法,可以在不同主机间交换数据,在        WIN9X下只支持邮件槽客户6。Windows套接字(Windows Socket)
       它具备消息管道所有的功能,但遵守一套通信标准使的不同操作系统之上的应    用程序之间可以互相通信。7。Internet通信 它让应用程序从Internet地址上载或下载文件8。RPC:远程过程调用,很少使用,因其与UNIX的RPC不兼容。9。串行/并行通信(Serial/Parallel Communication)
       它允许应用程序通过串行或并行端口与其他的应用程序通信10。COM/DCOM 
         通过COM系统的代理存根方式进行进程间数据交换,但只能够表现在对接口     函数的调用时传送数据,通过DCOM可以在不同主机间传送数据。