如何将背景窗口/过程放在最上面

时间:2014-11-19 23:29:27

标签: c# user32

我想创建一个类似虚拟键盘的软件,你有一个AlwaysTop窗口并使用它来将一些数据放在另一个进程/窗口上。在这种情况下,我将在剪贴板上记录所有数据,并比较这些数据是否与模式兼容(A###是patern,A123与模式兼容),如果是,应用程序将把它放入列表框,用户可以将其粘贴到另一个进程/窗口(已打开)上,单击列表中的项目。

我的问题是关于如何将这些信息放在最后使用的应用程序/进程上,我已经启动了代码原型但是指示的行是错误的,在我的代码中它是当前进程并且需要是最后一个在点击我的表格之前使用。

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
    }

    [DllImport("user32.dll")]
    static extern IntPtr SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    [DllImport("User32.dll")]
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);


    private void button2_Click(object sender, EventArgs e)
    {
    Process currentProcess = Process.GetCurrentProcess();   //this line is wrong
    IntPtr hWnd = currentProcess.MainWindowHandle;          //this line is wrong
    if (hWnd != IntPtr.Zero)
    {
        SetForegroundWindow(hWnd);
        ShowWindow(hWnd, 9);
    SendKeys.Send("A123");
    }
    }

}
}

1 个答案:

答案 0 :(得分:0)

我开始使用简单的解决方案,而不是获得流程,我只需发送组合ALT + TAB,并适用于我需要的所有情况。如果有人在将来需要,请在解决方案之下:

string old_clipboard = Clipboard.GetText();
Clipboard.SetText("A123");
SendKeys.SendWait("%{Tab}");
SendKeys.SendWait("^V");
Thread.Sleep(100);
Clipboard.SetText(old_clipboard);

Ps。:我放了一个延迟,因为SendWait仅适用于调用者窗口,因为^ V的目标是另一个进程它不能正常工作。

祝你好运。 =)