첫번째 캡쳐 : 일반적인 붙여넣기(ctrl+v)
두번째 캡쳐 : Base64로 붙여넣기(ctrl+shift+B)
옵시디안 사용을 하려다 보니,
이미지가 따로 파일로 저장되는것이 단점 이였다.
*모든 파일마다 _files라는 폴더를 만들어 저장하는데, 생각보다 트리구조가 지저분해짐.
클립보드 내용을 Base64로 만들어 옵시디안에 추가해 주면 좋겠다고 생각하고 있었는데, 그렇게 하는 프로그램을 Python 기반으로 만든 사람이 있었다.
그런데, PyQt를 해야 하고, 시간을 많이 투자하지 않기 위해
C#으로 자체적으로 만들기로 결정! (오랜만에 하려니 기억이 기억이 잘 안난다. ㅜ,.ㅜ)
1. 기본 프로젝트 생성
File – New – Project
C# 으로 설정하고, WPF App.(.NET Framework) 선택
버튼을 만들어서 시험해본다.
2. Clipboard 이미지를 Base64로 변환
클립 보드가 비어 있지 않고, 이미지 인 경우에만 동작
if ((System.Windows.Clipboard.GetDataObject() != null) && (System.Windows.Clipboard.ContainsImage()))
클립 보드 내용을 파일로 저장함
[참고사이트](Clipboard.GetImage Method (System.Windows) | Microsoft Learn)
var image = System.Windows.Clipboard.GetImage();
using (var fileStream = new FileStream(pngFile, FileMode.Create))
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(fileStream);
}
PNG 파일을 Base64로 변환
(참고한 사이트가 기억나지 않는다.)
StringBuilder sb = new StringBuilder("<img src=\"data: image / png; base64,");
byte[] imageBytes = File.ReadAllBytes(pngFile);
string base64String = Convert.ToBase64String(imageBytes);
sb.AppendFormat("{1}", filename, base64String);
sb.Remove(sb.Length - 2, 2);
sb.Append("\" alt = \"\" > ");
string Text = sb.ToString();
Base64 text를 다시 클립 보드에 업데이트
if (Text != null)
{
System.Windows.Clipboard.SetText(Text);
}
2. Hot Key 설정
MouseKeyHook 이라는 nuGet을 사용한다.
초기화 부분에 아래 코드 작성
public MainWindow()
{
InitializeComponent();
HotkeyManager.Current.AddOrReplace("Increment", Key.B, ModifierKeys.Control | ModifierKeys.Shift, ClipboardToBase64);
}
3. ctrl + V
아래 코드를 통해 keybd_event를 사용할 수 있도록 하고,
[DllImport("user32.dll")]
public static extern void keybd_event(byte vk, byte scan, int flags, ref int extrainfo);
Hotkey로 실행되었을 때는 해당 프로그램으로 포커스가 넘어 온상태이므로
ctrl + tab으로 붙여넣기 의도한 프로그램으로 바꾸고,
붙여넣기 함.
int info = 0;
keybd_event((byte)Keys.ControlKey, 0, 0, ref info);
keybd_event((byte)Keys.Tab, 0, 0, ref info);
keybd_event((byte)Keys.Tab, 0, 2, ref info);
keybd_event((byte)Keys.ControlKey, 0, 2, ref info);
keybd_event((byte)Keys.ControlKey, 0, 0, ref info);
keybd_event((byte)Keys.V, 0, 0, ref info);
keybd_event((byte)Keys.V, 0, 2, ref info);
keybd_event((byte)Keys.ControlKey, 0, 2, ref info);
keybd_event((byte)Keys.Down, 0, 0, ref info);
keybd_event((byte)Keys.Down, 0, 2, ref info);
keybd_event((byte)Keys.Enter, 0, 0, ref info);
keybd_event((byte)Keys.Enter, 0, 2, ref info);
전체 코드
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using NHotkey.Wpf;
using System.Threading;
namespace ClipToBase64
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public int Handle { get; private set; }
public MainWindow()
{
InitializeComponent();
HotkeyManager.Current.AddOrReplace("Increment", Key.B, ModifierKeys.Control | ModifierKeys.Shift, ClipboardToBase64);
}
[DllImport("user32.dll")]
public static extern void keybd_event(byte vk, byte scan, int flags, ref int extrainfo);
[STAThread]
private void ClipboardToBase64(object sender, NHotkey.HotkeyEventArgs e)
{
string filename = "temp";
string _001 = "d:\\00_Working_Temp\\" + filename + ".png";
string pngFile = _001;
if ((System.Windows.Clipboard.GetDataObject() != null) && (System.Windows.Clipboard.ContainsImage()))
{
var image = System.Windows.Clipboard.GetImage();
using (var fileStream = new FileStream(pngFile, FileMode.Create))
{
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(image));
encoder.Save(fileStream);
}
StringBuilder sb = new StringBuilder("<img src=\"data: image / png; base64,");
byte[] imageBytes = File.ReadAllBytes(pngFile);
string base64String = Convert.ToBase64String(imageBytes);
sb.AppendFormat("{1}", filename, base64String);
sb.Remove(sb.Length - 2, 2);
sb.Append("\" alt = \"\" > ");
string Text = sb.ToString();
if (Text != null)
{
System.Windows.Clipboard.SetText(Text);
}
int info = 0;
keybd_event((byte)Keys.ControlKey, 0, 0, ref info); // Ctrl key 다운
keybd_event((byte)Keys.Tab, 0, 0, ref info); // Tab key 다운
keybd_event((byte)Keys.Tab, 0, 2, ref info); // Tab key 업
keybd_event((byte)Keys.ControlKey, 0, 2, ref info); // Ctrl key 업
keybd_event((byte)Keys.ControlKey, 0, 0, ref info); // Ctrl key 다운
keybd_event((byte)Keys.V, 0, 0, ref info); // V key 다운
keybd_event((byte)Keys.V, 0, 2, ref info); // V key 업
keybd_event((byte)Keys.ControlKey, 0, 2, ref info); // Ctrl key 업
keybd_event((byte)Keys.Down, 0, 0, ref info); // key 다운
keybd_event((byte)Keys.Down, 0, 2, ref info); // Tab key 업
keybd_event((byte)Keys.Enter, 0, 0, ref info); // key 다운
keybd_event((byte)Keys.Enter, 0, 2, ref info); // Tab key 업
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
ClipboardToBase64(this,null);
}
}
}