文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>Windows平台进程间通信: 剪切板

Windows平台进程间通信: 剪切板

时间:2010-11-05  来源:kgisme170

         Windows里面只有一个剪切板的实例。剪切板如果被某个窗口独占了(OpenClipboard(hWnd)),那么系统的其他进程就不能再使用了。注意,剪切板的内容,GetClipboardData是做了一份拷贝,对这份拷贝做任何的修改,是不会修改剪切板的内容的,除非重新SetClipboardData设置剪切板的内容。当给剪切板传递内存句柄的时候,可以用GlobalAlloc也可以用LocalAlloc,这两个api在win32环境下没有区别。
VC2010express, 建立一个项目,包含两个工程(debug模式)

1. 主进程(MyConsole)打开剪贴版,设置一个字符'a',CreateProcess启动子进程,并等待子进程结束(WaitForSingleObject)
2. 子进程(client)打开剪贴版,读取字符的内容'a',把内容改为'b',关闭剪贴版。
3. 主进程再次读取剪贴版的内容,发现现在成了'b'。输出结果是:
subprocess entry
subprocess int=a
subprocess int=b
Changed clipboard,now pi=b
OpenClipboard again,now pi=b
Press any key to continue . . .

源代码,主程序:

#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <WinBase.h>
int _tmain(int argc, _TCHAR* argv[]){
    HANDLE hMem=LocalAlloc(GMEM_MOVEABLE,sizeof(int));
    char* pi=(char*)LocalLock(hMem);
    *pi='a';
    OpenClipboard(NULL);
    SetClipboardData(CF_TEXT,hMem);
    //    CloseClipboard();//这句可以没有
    STARTUPINFO StartupInfo;
    ZeroMemory(&StartupInfo,sizeof(STARTUPINFO));
    StartupInfo.cb=sizeof(STARTUPINFO);
    PROCESS_INFORMATION ProcessInformation;
    
    BOOL ret=CreateProcess(_T("..\\Debug\\client.exe"),0,0,0,
        TRUE,CREATE_DEFAULT_ERROR_MODE,0,0,&StartupInfo,&ProcessInformation);
    WaitForSingleObject(ProcessInformation.hProcess,INFINITE);
    if(FALSE==ret){
        printf("%d\n",GetLastError());
    }
    OpenClipboard(NULL);
    hMem=GetClipboardData(CF_TEXT);
    pi=(char*)LocalLock(hMem);
    printf("OpenClipboard again,now pi=%c\n",*pi);
    CloseClipboard();
    LocalUnlock(hMem);
    return 0;
}


子程序部分:

#include "stdafx.h"
#include<Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
    printf("\nsubprocess entry\n");
    if(!OpenClipboard(NULL)){
        printf("subprocess openclipboard failed\n");
        return 1;
    }
    HANDLE hMem=GetClipboardData(CF_TEXT);
    if(INVALID_HANDLE_VALUE==hMem){
        printf("Get clipboard data failed:%d\n",GetLastError());
        return 1;
    }
    char *pi=(char*)GlobalLock(hMem);
    printf("subprocess int=%c\n",*pi);
    *pi='b';
    printf("subprocess int=%c\n",*pi);
    SetClipboardData(CF_TEXT,hMem);
    CloseClipboard();
    GlobalUnlock(hMem);
    return 0;
}


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载