in reply to Re: print to clipboard
in thread print to clipboard

If you'll be cutting and pasting stuff to and from the clipboard as well as reading and writing it, then you'll want to convert \n to \r\n on the way to the clipboard, and vice versa on the way back. Otherwise you'll see \r in what you read, and when you paste other programs won't know what to do with the plain \n.

This conversion is automatically done for you when you read from/write to textfiles, but you have to do it yourself with Win32::Clipboard.

Replies are listed 'Best First'.
Re^3: print to clipboard
by tachyon (Chancellor) on Aug 24, 2004 at 16:06 UTC

    I appreciate the point but the code above runs as expected vis CRLF. The thing with Win32 clipboard is that it kinda makes conversions unnecessary. You just don't paste from Win32 to Gnome. And if you remain on Win32 then the line endings simply remain as they should be.

    cheers

    tachyon

      I'm sure that the above program worked in your test. But try the following experiment:

      Open up Notepad, write something, and copy it to the clipboard. Read the clipboard with Win32::Clipboard. Look for whether you now see \r inside Perl.

      Save the file from Notepad to the filesystem. In Perl, read that file, and copy it to the clipboard. Paste the clipboard into Notepad, and see how it deals with the straight \n's that you see.

      When I tried this a long time ago (I no longer deal with Windows, so it might have changed), the results were that other programs put \r\n into the clipboard and expected to find \r\n when they copied from it. Therefore you need to handle the conversion with the Win32 clipboard if you want to be able to get smooth interactions between Perl and other Windows programs.

        I don't do much Win32 these days either. As you say you need to deliver the expected. Here is an amusing snippet, relevant to the current:

        sub word_find_and_replace { my ( $word, $rel_file_path, $tokens_ref ) = @_; # first make a temporary file to do the search and replace on my ( $fh, $temp_name ) = get_tempfile( "$DOC_DIR/system", 'doc' ); close $fh; my $content_ref = read_file( "$DOC_DIR/$rel_file_path" ); create_file( "$DOC_DIR/system/$temp_name", $content_ref, 'overwrit +e ok' ); $word->{visible} = 0; my $doc = $word->{Documents}->Open("$DOC_DIR/system/$temp_name"); my $search_obj = $doc->Content->Find; my $replace_obj = $search_obj->Replacement; for my $token ( keys %$tokens_ref ) { my $find = '<?' . $token . '?>'; my $replace = $tokens_ref->{$token}; # now i know this looks weired but M$ word (at least 2000) wan +ts \r # as the para marker not \r\n or even \n if you send \n you ge +t little # binary squares..... oh well that's M$ for you. $replace =~ s/\r\n|\n/\r/g; # this makes it work properly. GO +K $search_obj->{Text} = $find; $replace_obj->{Text} = $replace; $search_obj->Execute({Replace => $wdReplaceAll}); } $doc->Save; $doc->Close; # now get the data out of the modified temp file $content_ref = read_file( "$DOC_DIR/system/$temp_name" ); # remove our unwanted temp files and objects unlink "$DOC_DIR/system/$temp_name"; undef $search_obj; undef $replace_obj; undef $doc; return $content_ref; }

        cheers

        tachyon