CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  Windows SDK/API

用程序将文字复制到剪贴板出现乱码,急!请各位高手帮忙!

楼主web9527()2005-04-04 11:43:45 在 Delphi / Windows SDK/API 提问

我的程序中有一个功能是将界面上显示的一些内容复制到剪贴板,然后用户可以按ctrl+v粘贴到excel或其他文本编辑器中,这个功能一直工作正常,然而最近有一个用户说他那里将文字复制到剪贴板后,再粘贴出来时,汉字全都变成了乱码,而系统中其他程序中拷贝粘贴功能是正常的,不知是什么原因,我在好几台计算机上都重复不出这个现象,所以感觉可能是系统中的什么设置改变了,但又不知如何恢复正常?  
  OS是windows2000server  
  下面是代码:  
   
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   Grids;  
   
  type  
      TForm1   =   class(TForm)  
          StringGrid1:   TStringGrid;  
          Button1:   TButton;  
          procedure   Button1Click(Sender:   TObject);  
          procedure   FormCreate(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  uses   clipbrd;  
  {$R   *.dfm}  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var   str1:string;i,j:integer;  
  begin  
    str1:='';  
    for   i:=0   to   stringgrid1.RowCount-1   do  
      begin  
        for   j:=1   to   stringgrid1.ColCount-1   do  
          str1:=str1+stringgrid1.cells[j,i]+chr(9);  
        str1:=str1+chr(13)+chr(10);  
      end;  
    clipboard.AsText:=str1;  
    showmessage('已经复制到剪贴板!');  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  var   i,j:integer;  
  begin  
    for   i:=0   to   stringgrid1.RowCount-1   do  
      for   j:=0   to   stringgrid1.ColCount-1   do  
        stringgrid1.Cells[j,i]:='abc汉字'+inttostr(random(100));  
  end;  
   
  end.  
  问题点数:100、回复次数:5Top

1 楼malamala(还真是笨)回复于 2005-04-04 11:57:40 得分 0

Windows使用剪贴板观察器和观察链。剪贴板观察器是一个显示剪贴板当前内容的窗口。通常它应该至少能显示三种普通格式的内容:文字CF_TEXT、位图CF_BITMAP、元文件CF_METAFILEPICT。剪贴板观察链是一系列相互独立的剪贴板观察窗口,它们都能够接受当前发送到剪贴板的内容。我们大致按照以下步骤在窗口中处理有关剪贴板的内容。    
   
  ----   首先,使用SetClipboardViewer(HWND)函数向剪贴板观察链中加入一个观察窗口。当剪贴板的内容发生变化时,该窗口会接收到一个WM_DRAWCLIPBOARD消息。该函数需要传递的参数是观察窗口的句柄。返回值也是一个窗口句柄类型,标识了将要加入的下一个窗口。    
   
  ----   然后,响应WM_DRAWCLIPBOARD消息处理剪贴板内容的变化。    
   
  ----   最后,在程序退出或关闭时需要调用ChangeClipboardChain函数来将自己从观察链中删除。然后调用SendMessage函数把这些消息传递到观察链中的下一个观察窗口。函数ChangeClipboardChain原型如下:    
   
  BOOL   ChangeClipboardChain(  
  HWND   hWndRemove,   //将要删除的窗口的句柄  
  HWND   hWndNewNext     //观察链中下一个窗口的句柄  
        );    
  ----   Delphi的clipbrd.pas单元中定义了一个类TClipboard,它封装了Windows剪贴板,简化了大量复杂的处理过程。我们在程序中可以直接调用全局函数Clipboard,该函数用于返回TClipboard对象实例,使用这个实例对剪贴板进行剪切、复制和粘贴等操作。下面是TClipboard对象的几个常用的方法和属性的简单介绍。    
   
  ----   方法:    
   
  ----   Assign:将指定的对象放入剪贴板中。    
   
  ----   Open:打开剪贴板,防止其他程序改写剪贴板。在向剪贴板加入多项数据时尤其有用。    
   
  ----   Close:关闭剪贴板。应该与打开剪贴板成对使用。    
   
  ----   Clear:清空剪贴板。    
   
  ----   GetAsHandle:返回剪贴板中指定格式数据的句柄。使用前必须打开剪贴板。    
   
  ----   GetComponent:返回剪贴板中的一个控件。Delphi自己使用得多。    
   
  ----   HasFormat:查询剪贴板中是否有指定格式的内容。    
   
  ----   属性:    
   
  ----   AsText:用于读写剪贴板文字内容。    
   
  ----   FormatCount:读剪贴板中数据格式的种数。    
   
  ----   Formats:返回剪贴板中各种格式的列表。    
   
  ----   此外,Delphi中的许多控件中也封装了有关剪贴板处理的操作。下面的一个处理剪贴板的简单例子,只是将剪贴板的文字内容显示为窗口标题。    
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,  
    Graphics,   Controls,   Forms,   Dialogs,  
      Clipbrd;//加入clipbrd单元  
   
  type  
      TForm1   =   class(TForm)  
          procedure   FormCreate(Sender:   TObject);  
  procedure   FormClose(Sender:   TObject;  
    var   Action:   TCloseAction);  
      private  
          {   Private   declarations   }  
      public  
          NextClipHwnd:HWND;//观察链中下一个窗口句柄  
  procedure   WMDrawClipBoard  
  (var   AMessage:TMessage);  
    message   WM_DRAWCLIPBOARD;  
  //处理WM_DRAWCLIPBOARD消息过程  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
   
  {$R   *.DFM}  
   
  {   TForm1   }  
   
  procedure   TForm1.WMDrawClip  
  Board(var   AMessage:   TMessage);  
  begin  
      //将WM_DRAWCLIPBOARD  
  消息传递到下一个观察链中的窗口  
      SendMessage(NextClipHwnd,AMessage.  
  Msg,AMessage.WParam,AMessage.LParam);  
      //查询剪贴板中特定格式的数据内容  
      if   (Clipboard.HasFormat(CF_TEXT)   or  
    Clipboard.HasFormat(CF_OEMTEXT))   then  
      begin  
          //处理剪贴板中内容  
          Caption:=Clipboard.asText;  
      end;  
  end;  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      //获得观察链中下一个窗口句柄  
      NextClipHwnd:=SetClipBoardViewer(Handle);  
  end;  
   
  procedure   TForm1.FormClose  
  (Sender:   TObject;   var   Action:   TCloseAction);  
  begin  
      //从观察链中删除本观察窗口  
      ChangeClipboardChain(Handle,NextClipHwnd);  
      //将WM_DRAWCLIPBOARD  
  消息传递到下一个观察链中的窗口  
      SendMessage(NextClipHwnd,WM_  
  CHANGECBCHAIN,Handle,NextClipHwnd);  
  end;  
   
  end.  
  ----   需要注意的是,在处理剪贴板内容变化的消息WM_DRAWCLIPBOARD的过程和关闭窗口事件中使用函数sendmessage把WM_DRAWCLIPBOARD或WM_CHANGECBCHAIN消息传递到观察链中的下一个窗口是必要的,否则有可能其他窗口不能获得类似消息。另外,在使用网络蚂蚁时笔者曾经碰到不能设置剪贴板格式的情况,在此提醒读者注意检查RegisterClipboardFormat等函数的返回值。  
  //////////////////////////////////////////////////////  
  unit   ClipboardViewer;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Classes,   Graphics,   Controls,   Forms,  
  Dialogs;  
   
  type  
      TForm1   =   class(TForm)  
          procedure   FormCreate(Sender:   TObject);  
          procedure   FormDestroy(Sender:   TObject);  
      private  
          FNextViewerHandle   :   THandle;  
          procedure   WMDrawClipboard   (var   message   :   TMessage);    
        message   WM_DRAWCLIPBOARD;  
          procedure   WMChangeCBCHain   (var   message   :   TMessage);    
      message   WM_CHANGECBCHAIN;  
      public  
      end;  
   
  var  
      Form1:   TForm1;  
   
  implementation  
  {$R   *.DFM}  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  begin  
      //   Hook   the   clipboard   viewer   chain  
      //   Should   also   check   for   a   possible   null   return   value,   which   indicates  
      //   that   the   function   failed.  
      FNextViewerHandle   :=   SetClipboardViewer(Handle);  
  end;  
   
  procedure   TForm1.FormDestroy(Sender:   TObject);  
  begin  
      //   Remove   ourselves   from   the   clipboard   viewer   chain.  
      ChangeClipboardChain(Handle,   FNextViewerHandle);  
  end;  
   
  procedure   TForm1.WMDrawClipboard   (var   message   :   TMessage);  
  begin  
  //   Called   whenever   contents   of   the   clipboard   changes  
      message.Result   :=   SendMessage(WM_DRAWCLIPBOARD,   FNextViewerHandle,   0,   0);  
  end;  
   
  procedure   TForm1.WMChangeCBCHain   (var   message   :   TMessage);  
  begin  
      //   Called   when   there   is   a   change   in   the   Clipboard   viewer   chain.  
      if   message.wParam   =   FNextViewerHandle   then   begin  
          //   the   next   viewer   in   the   chain   is   being   removed.   Update   our   internal   var.  
          FNextViewerHandle   :=   message.lParam;  
          //   Return   0   to   indicate   message   was   processed  
          message.Result   :=   0;  
      end   else   begin  
          //   Pass   message   on   to   next   window   in   chain.  
          message.Result   :=   SendMessage(FNextViewerHandle,   WM_CHANGECBCHAIN,  
  message.wParam,   message.lParam);  
      end;  
  end;  
   
   
  end.  
   
  Top

2 楼web9527()回复于 2005-04-04 16:35:33 得分 0

我现在碰到的是汉字乱码问题,英文正常,请哪位有类似经验的高手提供解决办法。Top

3 楼web9527()回复于 2005-04-05 10:14:29 得分 0

问题已经解决。Top

4 楼hellolongbin(一个人(自从扩充话题改版,再也不去灌水乐园了))回复于 2005-04-05 10:21:57 得分 0

学到了……Top

5 楼yjs_lh(长风浪子)回复于 2005-04-06 21:10:09 得分 100

当输入法区域不同时,剪贴板里的字符使用的字符集可能也不相同,粘贴的数据就可能出现乱码。所以在windows中使用剪贴板时,需要使复制时和粘贴时的输入法区域值相同。  
          有的机器只选择了一种输入法区域设置,当然不存在乱码的问题。  
  Top

相关问题

  • 100分求个点击TextBox就将内容复制到剪贴板的程序
  • 英文系统的剪贴板乱码问题
  • 把一个字符串复制到剪贴板?
  • 怎样把一个字符串复制到剪贴板?
  • 有关文件复制和剪贴板的关系的问题
  • 如何使用剪贴板复制并粘贴呢?
  • 如何复制多种格式的数据到剪贴板?
  • c++如何实现复制到剪贴板?
  • 怎么将数据复制到剪贴板???
  • 在页面上如何实现复制内容到剪贴板?

关键词

  • 函数
  • 乱码
  • 文字
  • 内容
  • 剪贴板
  • fnextviewerhandle
  • 句柄
  • tform
  • drawclipboard
  • 复制

得分解答快速导航

  • 帖主:web9527
  • yjs_lh

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo