如何将文本列表复制到剪贴板并逐一粘贴其项目?

问题描述 投票:0回答:1

我有源代码标签列表,我想将它们应用到 Ghidra 中适当的程序集位置。为此,我从列表中复制标签,并将其粘贴到 Ghidra 中。我必须重复这数百次。

我希望能够做的是,通过一次复制操作,将其作为单独的条目导入到剪贴板。然后,每次粘贴时,它都会粘贴列表中的一个项目,然后循环到下一个条目。

所以如果我有以下列表:

  • 酒吧
  • 爱丽丝
  • 鲍勃

将其复制到内存后,第一次粘贴操作将粘贴“foo”,第二次粘贴操作将粘贴“bar”,依此类推,直到列表末尾。

我了解了剪贴板管理器,但它们要求我先将每个项目逐一复制,然后才能粘贴它们。至少有一个似乎能够通过按键移动到下一个剪贴板条目,但那个只能容纳 10 个项目。

是否有剪贴板管理器或其他适用于 Windows 的工具可以为我执行此操作?

clipboard
1个回答
0
投票

我发现一个问题,有人试图使用 C++ 制作自己的剪贴板管理器。因此,我获取了代码,通过复制复制的文本而不是存储 char 指针来解决 OP 遇到的问题,并对其进行修改,以便它自动拆分复制的列表。

可能可以进一步改进以摆脱控制台窗口或至少在关闭所述窗口时正确终止,但它有效。

这是代码:

#include <iostream>
#include <string>
#include <vector>

std::vector<std::string> clipboardQueue;

std::vector<std::string> stringSplit(std::string& input, char delimiter) {
  std::string work = input;
  std::vector<std::string> result;
  unsigned int pos = 0;
  std::string token;

  while ((pos = work.find_first_of(delimiter)) != std::string::npos) {
    token = work.substr(0, pos);
    result.push_back(token);
    work.erase(0, pos + 1);
  }
  result.push_back(work);

  return result;
}

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) {
  PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT)lParam;
  if (wParam == WM_KEYDOWN) {
    if (p->vkCode == 0x43 && GetKeyState(VK_CONTROL) & 0x8000) {
      Sleep(500);
      OpenClipboard(0);
      std::string buffer = (char*)GetClipboardData(CF_TEXT);
      CloseClipboard();
      clipboardQueue = stringSplit(buffer, '\n');
      std::cout << "Clipboard size: " << clipboardQueue.size() << std::endl;
    }
    else if (p->vkCode == 0x56 && GetKeyState(VK_CONTROL) & 0x8000) {
      if (clipboardQueue.size() > 0) {
        const char* output = clipboardQueue[0].c_str();
        HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, clipboardQueue[0].size() + 1);
        memcpy(GlobalLock(hMem), output, clipboardQueue[0].size() + 1);
        GlobalUnlock(hMem);
        OpenClipboard(0);
        EmptyClipboard();
        SetClipboardData(CF_TEXT, hMem);
        CloseClipboard();
        clipboardQueue.erase(clipboardQueue.begin());
        std::cout << "Clipboard size: " << clipboardQueue.size() << "\n";
      }
    }
  }

  return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main() {
  OpenClipboard(0);
  EmptyClipboard();
  CloseClipboard();
  HHOOK keyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, 0, 0);
  MSG msg;

  while (GetMessage(&msg, 0, 0, 0)) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }

  UnhookWindowsHookEx(keyBoard);
}
© www.soinside.com 2019 - 2024. All rights reserved.