C # получить данные из другого автономного приложения? - PullRequest
5 голосов
/ 12 октября 2011

Как я позволю моей программе на c # получать данные из другого приложения?

Предположим, что это приложение, например, "Yahoo Messenger", и кто-то сказал вам "привет там" в чате ...

Теперь, я хочу, чтобы моя программа на c # считывала / получала эти данные или информацию из "окна чата Yahoo Messenger" и печатала их в моем приложении?это возможно?

Ответы [ 3 ]

4 голосов
/ 12 октября 2011

Вам понадобится использовать инструмент Visual Studio SPY ++ для понимания потока Win32 API.

После этого перейдите по этой ссылке

Получить текст из другого приложения .

http://www.dreamincode.net/forums/topic/66140-scraping-the-text-from-another-application-with-win32-api/

После реализации некоторой частикод, пожалуйста, перепостите более конкретный вопрос, связанный с программированием

2 голосов
/ 12 октября 2011

Будет легко, если это приложение (например, Yahoo Messenger) предоставит интерфейс (например, COM) для доступа других приложений к его информации.

Если нет, вам придется пройти через Windows API, захватывая дескриптор точного окна, в котором находится текст, и все.

Вы хоть представляете, какое у вас другое приложение?

EDIT: Проверьте этот ответ Yahoo. Кто-то задал тот же вопрос, может быть, вам помогут ссылки, приведенные в ответе: http://answers.yahoo.com/question/index?qid=20081126161509AAhr6Dz

Yahoo публикует ответ:

Я бы предложил посмотреть на libpurple. Это бэкэнд общего назначения с поддержкой Yahoo. Он используется IM-клиентом Pidgin, среди прочего.

Однако обратите внимание, что libpurple - это библиотека C ++, поэтому вам придется обращаться к нативному коду.

1 голос
/ 12 октября 2011

Если у вас есть контроль над «этим приложением» (например, Yahoo Messenger), вы можете создать общую память, используя winapi:

    LPSECURITY_ATTRIBUTES lpAtt=NULL;

    HANDLE INVALID_FILE_HANDLE=(HANDLE)0xFFFFFFFF; //Memory handle
    hMapFile=::CreateFileMapping(INVALID_FILE_HANDLE,
    lpAtt,PAGE_READWRITE, 0,nSize, SharedMemName);
    if (hMapFile == NULL) 
    { 
        ShowSomeMessageBox("Could not create shared memory");
        return NULL;
    }

    LPTSTR pBuf = (LPTSTR) MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS,0,0,nSize);
    if(NULL==pBuf) 
    {
        ShowSomeMessageBox("Could not create mapped view of theshared memory");
        return NULL;
}

Если у вас есть этот буфер, вы можете записать в него данные, используя CopyMemory или любой другой API-интерфейс.

В вашем приложении C # вы можете использовать InterOp (P-invoke) для вызова WinAPI:

Использование: OpenFileMapping (), MapViewOfFile () и т.д., чтобы открыть общую память

Использование: Marshal.ReadInt32 (), Marshal.StructureToPtr () и т.д., чтобы прочитать данные в ваши структуры данных C #.

...