2016-06-08 2 views
2

Хорошо У меня есть приложение под названием Sharknadoo, которое я создал, что это приложение делает для чтения значения из выпадающего списка от 1 до любого числа и создает это количество текстовых полей справа от него , enter image description hereОтправка информации из моего списка в разные текстовые поля приложения

enter image description here

Теперь давайте предполагать, у меня нет коды для этого sharknadoo приложения установлено только приложение на моем desktop.My вопрос, как я могу отправить мое listbox.items из «Моего удивительного приложения» к текстовые поля sharknadoo? Предполагая, что у меня одинаковое количество элементов в моем списке, поскольку у меня есть текстовые поля в другом приложении. Мне жаль, но я действительно хочу научиться этому, кто-то сказал мне, что это возможно, но я понятия не имею, как добиться этого было думать об использовании координат или что-то в этом роде, но из того, что я понял, вы можете даже зависать с тем, что приложение sharknadoo использует текстовые поля, даже не имея доступа к его исходному коду. Спасибо заранее друзьям: D. enter image description here

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++;   
      } 

Я понимаю логику моего кода не хорошо, но это все, что я мог придумать.

+3

Вы ищете "_interprocess communication_". – cubrr

+0

Я пробовал читать об этом до сих пор, из того, что я прочитал, есть способ достичь этого с помощью FindWindow и WM_COPYDATA, но я не могу понять, как ... –

+2

Вы могли бы, но это немного архаично. Я придерживаюсь использования IPC, это стоит изучить, и есть много вариантов. Для чего-то такого простого приложения-приложения на машине я бы посмотрел на [IPC, используя именованные каналы] (https://msdn.microsoft.com/en-us/library/bb546085 (v = vs.110) .aspx). – DonBoitnott

ответ

2

Этот ответ следует аналогичной логике вашему коду, но вместо этого имитирует штрихи клавиатуры и полагается на использование 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

+0

SendKeys.SendWait ((string) detailsToSend.Length); он говорит мне, что имя не существует в текущем контексте. –

+0

У меня на самом деле нет C# IDE для проверки моего кода, но он должен работать правильно, если вы действительно объявляете метод следующим образом: 'public void sendToSharknadoo (String [] detailsToSend)' Очевидно, вам нужно будет написать код вы можете отправить массив строк в метод в моем ответе. Кроме того, если это не проблема, это может быть проблемой с указателями, поскольку вы передаете жало во внешнее приложение, поэтому, возможно, это будет иметь значение: 'SendKeys.SendWait (" "+ detailsToSend.Length);' – sorifiend

+1

@ JohnPietrar Какое имя не существует? Я чувствую, что вы получите эту ошибку, если у вас есть орфографическая ошибка где-то в этой строке 'SendKeys.SendWait ((string) detailsToSend.Length);' – Zack

Смежные вопросы