效果,剪贴板复制一个字符串,希望用c#的$""输出方便后续修改其中的某些变量。
比如字符串:
ksal;kgal;kglkda;kks;lfaks\\a\sa[d]asdsa\s][[[[]][[][][][{}{}{{}{}{}{[S"ADSa''aG'SA"G"sa"G"AS"G""asfgasfafs{}{}{}
希望得到的字符串:
$"ksal;kgal;kglkda;kks;lfaks\\a\sa[d]asdsa\s][[[[]][[][][][{{}}{{}}{{{{}}{{}}{{}}{{[S\"ADSa''aG'SA\"G\"sa\"G\"AS\"G\"\"asfgasfafs{{}}{{}}{{}}"
如果手工写比较麻烦,于是我写了这个小工具,使用MFC框架实现。
实现直接转换剪贴板中的字符串,方便c#代码输出。
直接上代码:
#include <windows.h>
#include <atlstr.h>
CString ConvertStringForCsharpCode(CString& strPath)
{
CString result;
for (int i = 0; i < strPath.GetLength(); i++)
{
TCHAR ch = strPath[i];
switch (ch)
{
case _T('"'): // 双引号转义为\"
result += _T("\\\"");
break;
case _T('{'): // 左花括号转义为{{
result += _T("{{");
break;
case _T('}'): // 右花括号转义为}}
result += _T("}}");
break;
//case _T('\\'): // 反斜杠转义为\\(根据场景决定是否需要)
// result += _T("\\\\");
// break;
default:
result += ch;
}
}
return "$\"" + result + "\"";
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
char* buffer = nullptr;
CString strFromClipboard;
if (OpenClipboard(NULL))
{
HANDLE hData = GetClipboardData(CF_TEXT);
char* buffer = (char*)GlobalLock(hData);
strFromClipboard = buffer;
int nLen = strFromClipboard.GetLength();
if (nLen > 0)
{
EmptyClipboard();
strFromClipboard = ConvertStringForCsharpCode(strFromClipboard);
size_t cbStr = (strFromClipboard.GetLength() + 1) * sizeof(TCHAR);
HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE, cbStr);
memcpy_s(GlobalLock(hData), cbStr, strFromClipboard.LockBuffer(), cbStr);
strFromClipboard.UnlockBuffer();
UINT nFormat = (sizeof(TCHAR) == sizeof(WCHAR) ? CF_UNICODETEXT : CF_TEXT);
::SetClipboardData(nFormat, hData);
}
GlobalUnlock(hData);
CloseClipboard();
}
return 0;
}
下面是隐藏黑窗口的方法:
要将命令行程序改为窗口程序并隐藏黑框,可以采用下面的方法:
使用WinMain入口点(推荐)
- 将main改为WinMain
- 在项目属性中设置子系统为Windows
- 添加/SUBSYSTEM:WINDOWS链接器选项