2016-06-08 3 views
2

좋아, 내가 만든 Sharknadoo라는 앱이 있는데,이 앱은 콤보 상자의 값을 1에서 모든 숫자로 읽고 그 번호 오른쪽에 해당 수의 텍스트 상자를 만듭니다. . enter image description here내 목록 상자에서 다른 앱 텍스트 상자로 정보 전송

enter image description here

이제 우리가 그냥 응용 프로그램 내 desktop.My 질문에 설치된이 sharknadoo 응용 프로그램의 코드가없는 가정하자 어떻게에 "내 놀라운 응용 프로그램"에서 내 listbox.items를 보낼 수 있습니다 sharknadoo 텍스트 상자? 내가 다른 앱에 텍스트 상자가있는 것처럼 목록 상자에 같은 수의 항목이 있다고 가정합니다. 미안하지만 실제로이 작업을 수행하는 방법을 배우고 싶습니다. 누군가 달성 할 수 있다고 말했지만 어떻게해야합니까? 달성 좌표 또는 뭔가 그런,하지만 내가 이해할 수있는 사실도 sharknadoo 응용 프로그램이 심지어는 소스 코드에 액세스하지 않고 textboxes를 사용하는 걸릴 수 있습니다. 사전에 친구에게 감사 : 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 사용법을 고수 할 것입니다. 학습 가치가 있으며, 다양한 옵션이 있습니다. 컴퓨터에서이 단순한 app-to-app에 대해 [IPC using Named Pipes] (https://msdn.microsoft.com/en-us/library/bb546085(v=vs.110))를 살펴 보겠습니다. .aspx). – DonBoitnott

답변

2

이 답변은 코드와 비슷한 로직을 따르지 만 대신 키보드 스트로크를 시뮬레이트하고 상자를 탐색하기 위해 TAB을 사용하지만 귀하의 경우에도 작동합니다.

// 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 응용 프로그램에 대한 링크를 잡기 위해 나중에 사용하는 몇 가지 코드를 추가

할 것입니다 운이

// 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); 
    } 
} 

: 당신이 버튼 "Sharknadoo 보내기"를 클릭 할 때 우리는 다음과 같은 일을 할 수 있도록이 중 하나를)하기 전에 코드에서 Sharknadoo은 탭 인덱스는 0에 있어야합니다 속임수. 그러나 아마도 약간의 수표를 제자리에 넣는 명령을 어지럽 힐 필요가있을 것입니다.

참고 : 사용자가 간섭하기 전에 실행해야 더 빠르고 더 적극적인 접근 방식을 원하는 경우 다음 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

관련 문제