不可聚焦的形式C#

时间:2012-09-25 08:00:03

标签: c# winapi

我需要在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");
    }
}

表单不是我的应用程序的主要形式。 只有焦点在我的应用程序中时,代码才有效。如果我关注记事本或任何其他程序剪贴板内容未粘贴到它。 任何人都可以帮忙解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

我认为首先你必须确定一个发送击键的窗口。

我在这里找到了一个很好的sample at codeproject和很多问题:1other

答案 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_ACTIVATEWM_ACTIVATEAPP消息。然后,您可以使用SetActiveWindow设置焦点。你仍然应该像往常一样收到点击。