xclip for windows

下载源码和可执行文件 xclip.7z

  1 // The MIT License (MIT)
  2
  3 // Copyright (c) 2014 Rapptz
  4
  5 // Permission is hereby granted, free of charge, to any person obtaining a copy of
  6 // this software and associated documentation files (the "Software"), to deal in
  7 // the Software without restriction, including without limitation the rights to
  8 // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
  9 // the Software, and to permit persons to whom the Software is furnished to do so,
 10 // subject to the following conditions:
 11
 12 // The above copyright notice and this permission notice shall be included in all
 13 // copies or substantial portions of the Software.
 14
 15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 17 // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 18 // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 19 // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 20 // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 21
 22 #include <windows.h>
 23 #include <iostream>
 24 #include <fstream>
 25 #include <sstream>
 26 #include <string>
 27 #include <vector>
 28 #include <cstdlib>
 29
 30 struct clipboard {
 31 private:
 32     bool open;
 33 public:
 34     clipboard(HWND owner = nullptr): open(OpenClipboard(owner)) {}
 35
 36     clipboard(const clipboard&) = delete;
 37     clipboard(clipboard&&) = delete;
 38     clipboard& operator=(const clipboard&) = delete;
 39     clipboard& operator=(clipboard&&) = delete;
 40
 41     ~clipboard() {
 42         if(open) {
 43             CloseClipboard();
 44         }
 45     }
 46
 47     bool clear() const noexcept {
 48         return EmptyClipboard();
 49     }
 50
 51     bool is_open() const noexcept {
 52         return open;
 53     }
 54
 55     bool copy(const std::string& str) const {
 56         if(open) {
 57             clear();
 58             HGLOBAL buffer = GlobalAlloc(GMEM_DDESHARE, str.size() + 1);
 59             if(buffer) {
 60                 std::copy(std::begin(str), std::end(str), static_cast<char*>(GlobalLock(buffer)));
 61                 GlobalUnlock(buffer);
 62                 return SetClipboardData(CF_TEXT, buffer) != nullptr;
 63             }
 64         }
 65         return false;
 66     }
 67
 68     // no error checking on purpose
 69     std::string paste() const {
 70         return static_cast<char*>(GetClipboardData(CF_TEXT));
 71     }
 72 };
 73
 74 int help() {
 75     std::cout <<
 76     "usage: xclip [options]\n\n"
 77     "   -i, --in                  reads text from stdin (default)\n"
 78     "   -o, --out                 outputs text to stdout\n"
 79     "   -f, --file <filename>     reads text from a file\n"
 80     "   -v, --version             outputs version information\n"
 81     "   -h, --help                prints this message and exits\n";
 82     return EXIT_SUCCESS;
 83 }
 84
 85 int version() {
 86     std::cout <<
 87     "xclip version 1.0 (Windows native port)\n"
 88     "Written by Rapptz\n\n"
 89     "Copyright (C) 2014 Rapptz\n"
 90     "This is free software; see the source for copying conditions.  There is NO\n"
 91     "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
 92     return EXIT_SUCCESS;
 93 }
 94
 95 int error(const char* str) {
 96     std::cout << "xclip: error: " << str << ‘\n‘;
 97     return EXIT_FAILURE;
 98 }
 99
100 int read_text(const clipboard& clip) {
101     std::ostringstream ss;
102     for(std::string line; std::getline(std::cin, line); ) {
103         ss << line;
104     }
105     return clip.copy(ss.str()) ? EXIT_SUCCESS : EXIT_FAILURE;
106 }
107
108 int read_file(const clipboard& clip, const std::string& filename) {
109     if(filename.empty()) {
110         return error("no input file given");
111     }
112     std::ifstream in(filename);
113     std::ostringstream ss;
114     ss << in.rdbuf();
115     return clip.copy(ss.str()) ? EXIT_SUCCESS : EXIT_FAILURE;
116 }
117
118 int main(int argc, char** argv) {
119     clipboard clip;
120     if(!clip.is_open()) {
121         return error("unable to open clipboard");
122     }
123
124     std::vector<std::string> args{argv, argv + argc};
125
126     if(argc < 2) {
127         return read_text(clip);
128     }
129
130     for(int i = 1; i < argc; ++i) {
131         auto&& arg = args[i];
132
133         if(arg == "-h" || arg == "--help") {
134             return help();
135         }
136
137         if(arg == "-v" || arg == "--version") {
138             return version();
139         }
140
141         if(arg == "-i" || arg == "--in") {
142             return read_text(clip);
143         }
144
145         if(arg == "-o" || arg == "--out") {
146             std::cout << clip.paste();
147             return EXIT_SUCCESS;
148         }
149
150         if(arg == "-f") {
151             if(i + 1 < argc) {
152                 return read_file(clip, args[i + 1]);
153             }
154             return error("no input file given");
155         }
156
157         auto&& pos = arg.find("--file");
158         if(pos == 0) {
159             // len(--file) == 6
160             if(i + 1 < argc && arg.size() == 6) {
161                 return read_file(clip, args[i + 1]);
162             }
163             else if(arg[6] == ‘=‘) {
164                 return read_file(clip, arg.substr(7));
165             }
166             return error("no input file given");
167         }
168     }
169 }
时间: 2024-10-16 10:33:09

xclip for windows的相关文章

Windows API参考大全新编

书名:新编Windows API参考大全 作者:本书编写组 页数:981页 开数:16开 字数:2392千字 出版日期:2000年4月第二次印刷 出版社:电子工业出版社 书号:ISBN 7-5053-5777-8 定价:98.00元 内容简介 作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的.本书首先对Win32 API函数做完整的概述:然后收录五大类函数:窗口管理.图形设备接口.系统服务.国际特性以及网络服务:在附录部分,讲解如何

Git 配置ssh key的步骤

First start by setting up your own public/private key pair set. This can use either DSA or RSA, so basically any key you setup will work. On most systems you can use ssh-keygen. First you'll want to cd into your .ssh directory. Open up the terminal a

linux与windows共享剪贴板(clipboard)

linux与windows共享剪贴板(clipboard)的方法 先说两句废话,其实linux和windows之间不需要共享剪贴板,直接在putty中,按住SHIFT+鼠标选择就可以了. 但是作为一种hack行为或者不用鼠标实现复制功能,就需要这种方法了. 组合: putty+tmux+vim+mobaiterm/xserver 如果熟悉的朋友应该早已经用习惯了前面三个软件,号称三剑客. 后面的两个软件只是使用其中的一部分功能,即x window的剪贴板. xserver是指windows这边的

Linux: xclip,pbcopy,xsel用法 terminal 复制粘帖 (mac , ubuntu)

http://justcoding.iteye.com/blog/1829963 1. Windows下 使用系统自带的clip命令. # 位于C:\Windows\system32\clip.exe. 示例: C代码   echo Hello | clip # 将字符串Hello放入Windows剪贴板 dir | clip # 将dir命令输出(当前目录列表)放入Windows剪贴板 clip < README.TXT # 将readme.txt的文本放入Windows剪贴板 echo | 

在Windows下搭建Gitlab服务器

一.GitLab简介 GitLab 是一个用于仓库管理系统的开源项目.使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释.可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库.团队成员可以利用内置的简单聊天程序(Wall)进行交流.它还提供一个代码片段收集功能可以轻松实现代码复用. 二.GitLab和Github的联系和区别 Github - 一个网站,提供

Windows环境下阿里云添加SSH Key及Git配置Key

1. 运行 git-bash.exe 进入命令行 2. 判断是否已存在本地公钥: cat ~/.ssh/id_rsa.pub 如果看到一长串以 ssh-rsa 或 ssh-dsa 开头的字符串,可以跳过 ssh-keygen 步骤 3. 生成 ssh key ssh-keygen -t rsa "自定义标识符" 生成代码会有两个步骤,提示设置密码(默认没有密码).pub文件名称及保持路径,按Enter直接跳过步骤使用默认值.需要注意的是,如果自定义了文件名/路径,需要在 SSH 客户端

Windows Server定时重启任务制定

[本篇以Windows Server 2012 R2为例] 第一步:编写重启脚步 其实就是一句话:shutdown /r 其他shutdown命令参考可以使用shutdown /?查阅 第二步:设置任务计划程序 1.再开始-所有应用中找到任务计划程序 2.展开任务计划程序库,这里对任务计划程序做了很多的分类,我们找到System Manager类,在此类下创建自动重启系统任务 3.选择窗口右侧的创建任务(也可以使用创建基本任务,它是以向导的方法创建) 4.常规页面用于定义任务名称及执行任务的用户

windows安装TortoiseGit详细使用教程【基础篇】

环境:win8.1 64bit 安装准备: 首先你得安装windows下的git msysgit1.9.5 安装版本控制器客户端tortoisegit  tortoisegit1.8.12.0 [32和64别下载错,不习惯英文的朋友,也可以下个语言包] 一.安装图解: 先安装GIT[一路默认即可] 安装好git以后,右键,会发现菜单多了几项关于GIT的选项 2.安装tortoisegit[一路默认即可] 安装好以后,右键,会发现菜单多了几项关于tortoisegit的选项 到此,安装算完成了,相

Windows下尝试PHP7提示丢失VCRUNTIME140.DLL的问题解决

前天PHP7.0.0正式版发布了,有一些比较好的改进,官方也说速度比php5.6快了两倍,性能上有了很大提升,并且也发布了从php5.x向php7迁移的问题,所以今后php网站迁移后能够大幅度的提升网站性能,所以为了尝鲜我也去php官网下载了7.0的版本,通过命令行进行独立的测试,下载zip包后解压出来,下载后进入目录,将php.ini-development改为php.ini其余的参数暂时不用修改,然后在当前目录下新建test.php,输入简单的代码: 1 <?php 2 echo "H