初学Windows程序设计,老师要求写一个简单的应用程序,其中有条要求是:如果在一个计算机上运行两个程序实例,那么在任何一个程序中操作在另外的程序中都可以看到相同的操作结果。
这个要求让我有点无从下手,请各位前辈赐教,给我一个大概的思路,多谢了!

解决方案 »

  1.   

    如果在一个计算机上运行两个程序实例,那么在任何一个程序中操作在另外的程序中都可以看到相同的操作结果?恐怕很难得做得很完美了。可以将一个程序中截取的消息,通过IPC机制选择另一个程序,让它也模拟相同的消息?
      

  2.   

    这是Windows程序设计中典型的 内存共享啊.
      

  3.   

    油槽,管道,socket,共享内存,文件映射,剪切板等。
      

  4.   

    http://blog.csdn.net/seu07201213/archive/2006/07/19/941324.aspx
      

  5.   

    尝试一下使用全局消息:
    ============================================
    一方
    #define HELLO_MSG "{0AA4D707-87FD-4cd9-A2C9-ADB2194A86E0}"     //studio的工具生成的unsigned int idHelloMsg = ::RegisterWindowMessage(HELLO_MSG);
    DWORD dwRecipients = BSM_APPLICATIONS;
    ::BroadcastSystemMessage(BSF_IGNORECURRENTTASK, &dwRecipients, idHelloMsg, 0, 0);每个操作都发这样一个消息,第四、五参数自己可以定义
    ============================================
    另一方
    ON_REGISTERED_MESSAGE(idHelloMsg, OnBroadCast)afx_msg LRESULT OnBroadCast(WPARAM wParam, LPARAM lParam);
    ============================================
      

  6.   

    特别感谢seu07201213(【℡】〖汪洋中的一片叶子〗≈^︵^≈) 和mango279(木目) 两位朋友,我已经搞定这个模块
    同时也谢谢上面所有回答我问题的朋友。
      

  7.   

    //==========================管道开始================================
        //#define BUFSIZE 22000
        #define PIPE_TIMEOUT 1
        const int BUFSIZE = sizeof(swfData)-33; DWORD dwThreadId; 
    HANDLE hPipe, hThread; 
    //LPTSTR lpszPipename = _T("\\\\.\\Pipe\\Test");     //*
    hPipe = CreateNamedPipe( 
              g_lpszPipename,             // pipe name 
              PIPE_ACCESS_DUPLEX,       // read/write access 
              PIPE_TYPE_MESSAGE |       // message type pipe 
              PIPE_READMODE_MESSAGE |   // message-read mode 
              PIPE_WAIT,                // blocking mode 
              PIPE_UNLIMITED_INSTANCES, // max. instances  
              BUFSIZE,                  // output buffer size 
              BUFSIZE,                  // input buffer size 
              PIPE_TIMEOUT,             // client time-out 
              NULL);                    // no security attribute 
        //*/
        //hPipe = CreateNamedPipe(_T("\\\\.\\Pipe\\Test"), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, 1, 0, 0, 1000, NULL); // 创建命名管道
    if (hPipe == INVALID_HANDLE_VALUE)
        {
    ::MessageBox (NULL, TEXT ("失败"), TEXT ("测试"), MB_TOPMOST); 
        }
    else
    {
    // Create a thread for this client. 
    hThread = CreateThread ( 
                NULL,              // no security attribute 
                0,                 // default stack size 
                InstanceThread,    //(LPTHREAD_START_ROUTINE)InstanceThread
                (LPVOID) hPipe,    // thread parameter 
                0,                 // not suspended 
                &dwThreadId);      // returns thread ID  if (hThread == NULL) 
    ::MessageBox (NULL, TEXT ("hThread"), TEXT ("测试"), MB_TOPMOST); 
    else
    CloseHandle(hThread); 
    }    if (ConnectNamedPipe(hPipe, NULL) == FALSE) // 等待客户机的连接
        {
            ::MessageBox (NULL, TEXT ("连接失败"), TEXT ("测试"), MB_TOPMOST);
            CloseHandle(hPipe); // 关闭管道句柄
        } else {
            ::MessageBox (NULL, TEXT ("连接成功"), TEXT ("测试"), MB_TOPMOST);
        }    // 从管道读取数据
        char buffer[22000]; // 数据缓存
        DWORD ReadNum;
        if (ReadFile(hPipe, buffer, sizeof(swfData), &ReadNum, NULL) == FALSE)
        {
            CloseHandle(hPipe); // 关闭管道句柄
            ::MessageBox (NULL, TEXT ("从管道读取数据失败!"), TEXT ("测试"), MB_TOPMOST);
        } else {
            //buffer[ReadNum] = _T('\0'); // 显示接收到的信息
            ::MessageBox (NULL, TEXT ("从管道读取数据成功!"), TEXT ("测试"), MB_TOPMOST);
            //TCHAR szTemp[22000];
        //wsprintf (szTemp, TEXT ("%s"), buffer);
            //memcpy(szTemp, buffer, sizeof(buffer));
        //::MessageBox (NULL, szTemp, TEXT ("测试"), MB_TOPMOST);
        }
        //*/    while(!::WriteFile(hFile, buffer, BUFSIZE, &dwWritten, NULL));
        ::FlushFileBuffers(hFile);
        ::CloseHandle(hFile);    // 终止连接
        if (DisconnectNamedPipe(hPipe) == FALSE)
            ::MessageBox (NULL, TEXT ("终止连接失败!"), TEXT ("测试"), MB_TOPMOST);
        else
        {
            ::MessageBox (NULL, TEXT ("终止连接成功!"), TEXT ("测试"), MB_TOPMOST);
            //CloseHandle(hPipe); // 关闭管道句柄
        }
    // 管道客户机 unsigned long
    DWORD WINAPI CAboutDlg::InstanceThread(LPVOID lpvParam) 
    {
        //TCHAR szMsg[] = _T("[测试数据由客户机发出]"); // 要发送的数据
        DWORD WriteNum; // 发送的是数据长度
        
        // 等待与服务器的连接
        if (WaitNamedPipe(g_lpszPipename, NMPWAIT_WAIT_FOREVER) == FALSE)
        {
            //::MessageBox (NULL, TEXT ("等待连接失败!"), TEXT ("测试"), MB_TOPMOST);
            return 0;
        }
        // 打开已创建的管道句柄
        HANDLE hPipe = CreateFile(g_lpszPipename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hPipe == INVALID_HANDLE_VALUE)
        {
            ::MessageBox (NULL, TEXT ("管道打开失败!"), TEXT ("测试"), MB_TOPMOST);
            return 0;
        } else {
            //::MessageBox (NULL, TEXT ("成功打开管道!"), TEXT ("测试"), MB_TOPMOST);
        }
        // 向管道写入数据
        //WriteFile(hFile, &swfData[32], sizeof(swfData)-9, &dwWritten, NULL)
        //if (WriteFile(hPipe, szMsg, sizeof(szMsg), &WriteNum, NULL) == FALSE)
        if (WriteFile(hPipe,&swfData[32], sizeof(swfData)-9, &WriteNum, NULL) == FALSE)
        {
            ::MessageBox (NULL, TEXT ("数据写入管道失败!"), TEXT ("测试"), MB_TOPMOST);
        } else {
            ::MessageBox (NULL, TEXT ("数据成功写入管道!"), TEXT ("测试"), MB_TOPMOST);
            FlushFileBuffers(hPipe);
            //::ShellExecute(NULL, _T("open"), g_szFlashPlayer, g_lpszPipename, NULL, SW_SHOWMAXIMIZED);
        }    CloseHandle(hPipe); // 关闭管道句柄 return 1;
    }