我有一个在后端运行的 Windows 应用程序。我将此应用程序中的功能映射到热键。就像我在这个函数中放入一个消息框并将热键作为Alt++ 。然后按,同时出现消息框。到目前为止,我的应用程序运行良好。CtrlDAltCtrlD
现在我想在这个函数中编写一个代码,这样当我使用像记事本这样的另一个应用程序时,我选择一个特定的文本行并按热键Alt++它应该复制选定的文本,并在其后面加上“_copied”Ctrl和D将其粘贴回记事本。
任何尝试过类似应用程序的人都请帮助我提供宝贵的意见。
你的问题有两个答案
您必须调用一个名为 RegisterHotKey 的 API 函数
BOOL RegisterHotKey(
HWND hWnd, // window to receive hot-key notification
int id, // identifier of hot key
UINT fsModifiers, // key-modifier flags
UINT vk // virtual-key code
);
更多信息在这里: http: //www.codeproject.com/KB/system/nishhotkeys01.aspx
最简单的方法是将 crl-C 发送到窗口,然后捕获剪贴板内容。
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll", CharSet=CharSet.Auto)]
static public extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
.....
private void SendCtrlC(IntPtr hWnd)
{
uint KEYEVENTF_KEYUP = 2;
byte VK_CONTROL = 0x11;
SetForegroundWindow(hWnd);
keybd_event(VK_CONTROL,0,0,0);
keybd_event (0x43, 0, 0, 0 ); //Send the C key (43 is "C")
keybd_event (0x43, 0, KEYEVENTF_KEYUP, 0);
keybd_event (VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);// 'Left Control Up
}
免责声明:Marcus Peters 的代码来自此处:http
://bytes.com/forum/post1029553-5.html
为了您的方便而在此处发布。
使用Clipboard类将内容复制到剪贴板,然后粘贴到记事本中。
您还可以将内容写入文本文件,并通过运行 notepad.exe 应用程序并将文本文件的路径作为命令行参数使用记事本打开它。
不知道这可能持续了多长时间,但我没有与大多数 SO 线程中关于该主题的建议的Win32 编程(主要是user32.dll
各种 Windows 消息WM_GETTEXT, WM_COPY
和各种调用)作斗争,我很容易设法在任何窗口中访问选定的文本我的 C# 代码如下:SendMessage(handle, WM_GETTEXT, maxLength, sb)
// programatically copy selected text into clipboard
await System.Threading.Tasks.Task.Factory.StartNew(fetchSelectionToClipboard);
// access clipboard which now contains selected text in foreground window (active application)
await System.Threading.Tasks.Task.Factory.StartNew(useClipBoardValue);
这里调用的方法:
static void fetchSelectionToClipboard()
{
Thread.Sleep(400);
SendKeys.SendWait("^c"); // magic line which copies selected text to clipboard
Thread.Sleep(400);
}
// depends on the type of your app, you sometimes need to access clipboard from a Single Thread Appartment model..therefore I'm creating a new thread here
static void useClipBoardValue()
{
Exception threadEx = null;
// Single Thread Apartment model
Thread staThread = new Thread(
delegate ()
{
try
{
Console.WriteLine(Clipboard.GetText());
}
catch (Exception ex)
{
threadEx = ex;
}
});
staThread.SetApartmentState(ApartmentState.STA);
staThread.Start();
staThread.Join();
}
我认为您可以使用SendInput函数将文本发送到目标窗口,或者如果您之前已将其放入剪贴板,则只需将其粘贴的命令即可。