我需要在C#中创建不可聚焦的表单。 在那个表格上会有按钮。按下该按钮后,我想将System.Clipboard的内容粘贴到cursot所在的位置。 这就是我现在所拥有的:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
const int WS_EX_NOACTIVATE = 0x08000000;
const int WS_EX_TOPMOST = 0x00000008;
const int WS_EX_TOOLWINDOW = 0x00000080;
const int WM_MOUSEACTIVATE = 0x0021;
const int WS_EX_WINDOWEDGE = 0x00000100;
const int MA_NOACTIVATEANDEAT = 4;
const int WM_NCHITTEST = 0x0084;
//const int WM_ACTIVATEAPP = 0x001C;
const int WS_THICKFRAME = 0x00040000;
const int WS_CHILD = 0x40000000;
const int WS_BORDER = 0x00800000;
const int WS_DLGFRAME = 0x00400000;
const int WS_CAPTION = WS_BORDER | WS_DLGFRAME;
const int WS_SYSMENU = 0x00080000;
protected override bool ShowWithoutActivation { get { return true; } }
protected override CreateParams CreateParams
{
get
{
CreateParams ret = base.CreateParams;
ret.Style = WS_THICKFRAME |
WS_CHILD |
WS_CAPTION |
WS_SYSMENU;
ret.ExStyle |= WS_EX_NOACTIVATE |
WS_EX_TOOLWINDOW |
WS_EX_TOPMOST |
WS_EX_WINDOWEDGE;
ret.X = this.Location.X;
ret.Y = this.Location.Y;
return ret;
}
}
private void simpleButton1_Click(object sender, EventArgs e)
{
Clipboard.SetText("text1 text2");
SendKeys.SendWait("^v");
}
}
表单不是我的应用程序的主要形式。 只有焦点在我的应用程序中时,代码才有效。如果我关注记事本或任何其他程序剪贴板内容未粘贴到它。 任何人都可以帮忙解决这个问题吗?
答案 0 :(得分:0)
我认为首先你必须确定一个发送击键的窗口。
我在这里找到了一个很好的sample at codeproject和很多问题:1和other
答案 1 :(得分:0)
学会正确地标题。我相信你正在寻找一个剪贴板监视器片段。您必须注册您的应用程序以拦截剪贴板更改的事件。
[DllImport("User32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
_ClipboardViewerNext = SetClipboardViewer(this.Handle);
protected override void WndProc(ref Message m)
{
switch ((Win32.Msgs)m.Msg)
{
case Win32.Msgs.WM_DRAWCLIPBOARD:
// Handle clipboard changed
break;
// ...
}
}
请参阅this answer和此article。
答案 2 :(得分:0)
当您的应用程序获得焦点时,将发送包含先前焦点窗口句柄的WM_ACTIVATE
或WM_ACTIVATEAPP
消息。然后,您可以使用SetActiveWindow
设置焦点。你仍然应该像往常一样收到点击。