同时打开两个一样的程序,在一个窗口里画线,要在另一个程序的窗口中同时显示出这条直线,用SENDMESSAGE该怎么写啊?我都写了半天了.

解决方案 »

  1.   

    用SendMessage可能需要使用到自定义注册的全局消息吧,还是用Socket吧,呵呵!
      

  2.   

    大哥,我没办法,规定用API函数的啊.发送消息窗口的句柄也有了,就是不知道该怎么做啊.
      

  3.   

    记得WINDOWS程序设计里面有这样一个例子的在DLL那章去查查
      

  4.   

    用普通的消息传递就行。下面是一个简单的SDK例子,虽然还有点问题(鼠标移动到窗口外时有时候画的线不对),但是“在一个窗口里画线,要在另一个程序的窗口中同时显示出这条直线”的功能是实现了的。#include <windows.h>LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);TCHAR    szAppName[] = TEXT("DrawLine");int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR szCmdLine,int iCmdShow)
    {
    WNDCLASS wndclass;
    MSG      msg;
    HWND     hwnd; wndclass.cbClsExtra     = 0;
    wndclass.cbWndExtra     = 0;
    wndclass.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
    wndclass.hCursor        = LoadCursor(NULL,IDC_ARROW);
    wndclass.hIcon          = LoadIcon(NULL,IDI_WINLOGO);
    wndclass.hInstance      = hInst;
    wndclass.lpfnWndProc    = WndProc;
    wndclass.lpszClassName  = szAppName;
    wndclass.lpszMenuName   = NULL;
    wndclass.style          = CS_VREDRAW | CS_HREDRAW; RegisterClass(&wndclass); hwnd = CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,
                    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,NULL,hInst,NULL);
    ShowWindow(hwnd,iCmdShow);
    UpdateWindow(hwnd);
    while(GetMessage(&msg,NULL,0,0))
    DispatchMessage(&msg);
    return msg.wParam;
    }void NotifyAllSblings(UINT msg,WPARAM wParam,LPARAM lParam)
    {
    HWND hwnd; hwnd = FindWindowEx(NULL,NULL,szAppName,NULL);
    while (hwnd != NULL)
    {
    PostMessage(hwnd,msg,wParam,lParam);
    hwnd = FindWindowEx(NULL,hwnd,szAppName,NULL);
    }
    }LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    HDC            hdc;
    PAINTSTRUCT    ps;
    static  POINT  start,end,cur; switch(msg)
    {
    case WM_LBUTTONDOWN + WM_USER:
    case WM_LBUTTONDOWN:
    if (msg == WM_LBUTTONDOWN)
    {
    SetCapture(hwnd);
    NotifyAllSblings(msg + WM_USER,wParam,lParam);
    }
    else
    {
    start.x = start.y = -1; end = start;
    InvalidateRect(hwnd,NULL,TRUE);
    UpdateWindow(hwnd);
    start.x = LOWORD(lParam);
    start.y = HIWORD(lParam);
    end = start;
    }
    break;
    case WM_MOUSEMOVE + WM_USER:
    case WM_LBUTTONUP + WM_USER:
    case WM_MOUSEMOVE:
    case WM_LBUTTONUP:
    if ((msg == WM_MOUSEMOVE || msg == WM_LBUTTONUP))
    {
    if (GetCapture() == hwnd)
    {
    if (msg == WM_LBUTTONUP) ReleaseCapture();
    NotifyAllSblings(msg + WM_USER,wParam,lParam);
    }
    }
    else 
    {
    hdc = GetDC(hwnd);
    SetROP2(hdc,R2_NOT); MoveToEx(hdc,start.x,start.y,NULL);
    LineTo(hdc,end.x,end.y); end.x = LOWORD(lParam);
    end.y = HIWORD(lParam);
    MoveToEx(hdc,start.x,start.y,NULL);
    LineTo(hdc,end.x,end.y); ReleaseDC(hwnd,hdc);
    }
    break; case WM_PAINT:
    hdc = BeginPaint(hwnd,&ps); MoveToEx(hdc,start.x,start.y,NULL);
    LineTo(hdc,end.x,end.y); EndPaint(hwnd,&ps);
    return 0;
    case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
    }
    return DefWindowProc(hwnd,msg,wParam,lParam);
    }
      

  5.   

    非常感谢,实验下来效果可以。不过我有几点疑问。WM_USER消息能不能作个具体说明setcapture()和getcapture()是什么作用,抱歉,我MSDN没装,WINDOWS程序设计的电子文档也删除了,只好把问题放这里问了。
      

  6.   


       WM_USER 不是消息,它是Windows系统定义的ID最大的消息。用户自定义的消息必须大于它,所以一般自定义消息都写成这个样子:
       #define  WM_MYMESSAGE  WM_USER + 100
    我在程序里面使用了3个自定义消息:WM_LBUTTONDOWN + WM_USER,WM_MOUSEMOVE + WM_USER和
    WM_LBUTTONUP + WM_USER,不过没有写成上述形式。其实你可以自己改成:
       #define   WM_MYLBUTTONDOWN  WM_USER + 100
       #define   WM_MYMOUSEMOVE    WM_USER + 200
       #define   WM_MYLBUTTONUP    WM_USER + 300
    这样的形式的。SetCapture()的功能是设置鼠标捕获。一般情况下,鼠标从移动到窗口外面之后,窗口就收不到鼠标消息了。用SetCapture()设置鼠标捕获后,即使鼠标移动到了窗口外面,Windows也还是把鼠标消息发送到窗口。GetCapture()的功能是取得系统中当前捕获鼠标的窗口的句柄。ReleaseCapture()的功能是释放鼠标捕获。你的程序如果一直捕获鼠标,那么别的程序就收不到鼠标消息了,这在多任务的Windows环境中是不礼貌的,所以应该在适当的时候释放鼠标捕获。最后说明一点,为了防止捕获鼠标的窗口出现意外(如死循环)而不能释放鼠标捕获,Windows要求当鼠标键处于按下状态时,鼠标捕获才有用,也就是说,松开鼠标键后,即使你不释放鼠标捕获,Windows也会自动释放鼠标捕获。
      

  7.   

    上面的第一句话有问题,应该改成:WM_USER 是Windows系统定义的消息的最大ID。其实它只是一个数而已。Windows系统定义的消息的ID都小于或者等于它(有没有ID等于WM_USER的消息我不知道)。