我正在使用WinForms处理一个小剪贴板助手。当用户复制项目时,它将保存到我的内部剪贴板中。然后当用户按住Ctrl + v我的表单显示时,显示最近的剪贴板项目,用户可以使用向上/向下箭头来更改剪贴板。这意味着您可以快速粘贴历史剪贴板项目。它主要是工作但我有一个问题,我找不到一个“好”的方式。
编辑文本时,说在Windows资源管理器中重命名文件夹,用户按ctrl + v,我的表单到达前面,它会窃取焦点并退出Windows资源管理器中的文本编辑模式。我可以使用WinApi中的SetWindowPos(),这样我的表单就不会窃取焦点......问题是我需要焦点,这样我才能捕获上/下键。我确实有一个键盘钩子,所以我可以实际捕捉按键,但是当我选择下一个项目时,它会获得焦点,并且我必须捕获相当多的丑陋场景。
那么,有没有办法设置我的整个应用程序永远不会获得焦点或任何人都可以想到另一种解决这个问题的方法?
[编辑]添加了一些代码,如果你想要更多,请告诉我。 KeyDown和KeyUp我认为是我需要处理这个问题的地方
private void kHook_KeyDown(object sender, WindowsHookLib.KeyboardEventArgs e) {
if (selecting)
return; // Already selecting
if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) {
selecting = true;
wHandle = WinApi.GetForegroundWindow();
// -----------------
// Need to display my form here without losing text edit mode in whatever application they are in and editing text in.
WinApi.ShowInactiveTopmost(showClipboard);
//showClipboard.Show();
// ------------------
}
}
private void kHook_KeyUp(object sender, WindowsHookLib.KeyboardEventArgs e) {
// Check if this key is one that we care about
if (!KeyIsInteresting(e) || pasting)
return;
if (selecting) {
switch (e.KeyCode) {
case Keys.V:
showClipboard.Hide();
WinApi.SetForegroundWindow(wHandle);
System.Threading.Thread.Sleep(10); // Wait for original window to gain regain focus
pasting = true;
SendKeys.Send("^v");
Clipboard.MoveToBottom(); // Add this item to the bottom so that it is first on the list next time
pasting = false;
selecting = false;
break;
case Keys.Delete:
Clipboard.RemoveItem();
showClipboard.RefreshClipboardList();
break;
}
}
}