【问题标题】:Sending information from my listbox to different app textboxes将信息从我的列表框发送到不同的应用程序文本框
【发布时间】:2016-06-08 08:39:14
【问题描述】:

好的,我创建了一个名为 Sharknadoo 的应用程序,该应用程序的作用是从组合框中读取从 1 到任意数字的值,并在其右侧创建该数量的文本框。

现在让我们假设我没有此 Sharnadoo 应用程序的代码,只是安装在我的桌面上的应用程序。我的问题是如何将我的 listbox.items 从“我的惊人应用程序”发送到 Sharnadoo 文本框?假设我的列表框中的项目数量与我的其他应用程序中的文本框数量相同。我很抱歉,但我真的很想学习如何做到这一点,有人告诉我有可能实现,但我不知道如何去做实现它是在考虑使用坐标或类似的东西,但据我了解,你甚至可以坚持这样一个事实,即 sharknadoo 应用程序正在使用文本框,甚至无法访问其源代码。提前谢谢朋友们:D。

  Process[] processes = Process.GetProcessesByName("Sharknadoo.exe");
            int i = 0;
            foreach (Process p in processes)
            {
                IntPtr windowHandle = p.MainWindowHandle;
                string item = listBox1.Items[i].ToString();
                listBox1.Items.Add(item);
                i++;         
            }

我意识到我的代码逻辑不好,但这是我能想到的。

【问题讨论】:

  • 您正在寻找“进程间通信”。
  • 直到现在我都在尝试阅读这方面的内容,从我所阅读的内容来看,有一种方法可以使用 FindWindow 和 WM_COPYDATA 来实现这一点,但我不明白如何......
  • 你可以,但这有点过时了。我会坚持使用IPC,值得学习,而且有很多选择。对于机器上这种简单的应用程序到应用程序,我会查看IPC using Named Pipes
  • @DonBoitnott 如果就这么简单,你能给我一个直接的例子来解决我的问题吗?
  • @JohnPietrar 你只有My Amazing App 的源代码吗?如果您有这两个应用程序的源代码,您可以使用WCF 在应用程序之间进行通信。但是如果您没有Sharknadoo 的源代码,那么您应该找到那些TextBox 句柄并将WM_SETTEXT 发送到这些句柄。告诉我这是怎么回事?

标签: c# .net winforms listbox communication


【解决方案1】:

此答案遵循与您的代码类似的逻辑,而是模拟键盘敲击并依赖于使用 TAB 来导航框,但它应该适用于您的情况。

首先添加一些我们稍后将使用的代码来获取指向您的 Sharknadoo 应用程序的链接:

// Get a handle to an application window.
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

// Activate an application window.
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

现在假设您在应用程序中没有接触任何东西(非常危险的假设,最好在执行任何操作之前从您的代码中启动 Sharknadoo),标签索引应为 0,因此我们可以执行以下操作当您点击“发送到 Sharknadoo”按钮时:

// Send a your array of names to the Sharknadoo application.
public void sendToSharknadoo(String[] detailsToSend)
{
    // Get a handle to the Sharknadoo application. The window class
    // and window name can be obtained from Sharknadoo using the
    // Spy++ tool.
    IntPtr windowHandle = FindWindow("SharknadooFrame","Sharknadoo");

    // Verify that Sharknadoo is a running process.
    if (windowHandle == IntPtr.Zero)
    {
        MessageBox.Show("Sharknadoo is not running.");
        return;
    }

    // Make Sharknadoo the foreground application and set the number 
    // of text boxes for your info
    SetForegroundWindow(windowHandle);
    // Get to first box
    SendKeys.SendWait("{TAB}");
    // enter number of boxes
    SendKeys.SendWait("{DOWN}");
    SendKeys.SendWait((string)detailsToSend.Length);

    // Now enter your details into each of those boxes
    foreach (String s in detailsToSend)
    {
        // Get next textbox box
        SendKeys.SendWait("{TAB}");
        // enter text into box
        SendKeys.SendWait(s);
    }
}

如果运气好的话。但是,您可能需要弄乱订单,并进行一些检查。

注意:如果您想要在用户干预之前执行更快更激进的方法,请尝试使用SendKeys.Send() 而不是SendKeys.SendWait()


来源:

https://msdn.microsoft.com/en-us/library/ms171548(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys(v=vs.110).aspx

类似这样的其他堆栈溢出问题:

Insert text into the textbox of another application

【讨论】:

  • SendKeys.SendWait((string)detailsToSend.Length);它告诉我该名称在当前上下文中不存在。
  • 我实际上并没有安装 C# IDE 来测试我的代码,但只要您实际声明这样的方法,它就应该可以正常工作:public void sendToSharknadoo(String[] detailsToSend) 显然您需要编写一些代码以便您可以将字符串数组发送到我的答案中的方法。此外,如果这不是问题,那么它可能是指针问题,因为您正在将 sting 传递给外部应用程序,所以也许这会有所作为:SendKeys.SendWait("" +detailsToSend.Length);
  • @JohnPietrar 什么名字不存在?如果您在该行的某处有拼写错误,我觉得您会收到该错误SendKeys.SendWait((string)detailsToSend.Length);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2012-12-26
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多