完全に個人的な理由で「クリップボード内テキストの先頭数行を除去するアプリケーション」を作成しました。
このブログの記事はあるフリーのアウトラインプロセッサで作成、管理しているのですが、できあがった記事をワードプレスに投稿するときに先頭の3行以外の全文をコピペすることになります。文章が長いとこれが面倒くさいです。全文コピペならCtrl+A → Ctrl+C → (ワードプレスの投稿ページに移動して)Ctrl+Vで簡単にできるのですけどね。
そこで全文コピー、最初の3行だけ取り除くというアプリケーションをつくってみました。3行ではなくそれ以外の行数も設定可能です。
まずクリップボード内のテキストを取得します。そして”\r\n”を探します。みつかったらそこから2文字(”\r\n”が2文字なので)進めた場所からString.Substringメソッドで文字列を取得します。そしてクリップボードに格納します。
1 2 3 4 5 6 7 8 9 10 11 12 |
string s = Clipboard.GetText(); int index = 0; for(int i = 0; i < numericUpDown1.Value; i++) { index = s.IndexOf("\r\n", index); index += 2; } s = s.Substring(index); Clipboard.SetText(s); richTextBox1.Text = s; |
エラー処理(クリップボード内がテキストではない、文字列だけど行数が足りない場合など)も含めると以下のようになります。普段はタスクトレイのなかに表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); numericUpDown1.Minimum = 1; numericUpDown1.Value = 3; notifyIcon1.MouseDown += NotifyIcon1_MouseDown; notifyIcon1.Text = Application.ProductName; } private void buttonRemoveLine_Click(object sender, EventArgs e) { if(Clipboard.ContainsText()) { string s = Clipboard.GetText(); int len = s.Length; int index = 0; bool isFailure = false; for(int i = 0; i < numericUpDown1.Value; i++) { index = s.IndexOf("\r\n", index); if(index == -1) { isFailure = true; break; } else index += 2; if(index > len) { isFailure = true; break; } } if(!isFailure) { s = s.Substring(index); Clipboard.SetText(s); richTextBox1.Text = s; } else { string str = String.Format("クリップボード内のテキストは {0} 行以下です", numericUpDown1.Value); MessageBox.Show(str, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("クリップボード内にテキストはありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonCheckClipboardText_Click(object sender, EventArgs e) { if(Clipboard.ContainsText()) { string s = Clipboard.GetText(); int index = s.IndexOf("\r\n"); if(index == -1) MessageBox.Show("クリップボード内のにテキストは1行だけです", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); else richTextBox1.Text = s; } else { MessageBox.Show("クリップボード内にテキストはありません", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } } bool isEnd = false; protected override void OnFormClosing(FormClosingEventArgs e) { if(!isEnd) { e.Cancel = true; this.Visible = false; } base.OnFormClosing(e); } private void NotifyIcon1_MouseDown(object sender, MouseEventArgs e) { this.Visible = true; } private void buttonExit_Click(object sender, EventArgs e) { isEnd = true; Application.Exit(); } } |