Получть доступ к управлению над другими приложениями

Тема в разделе ".NET", создана пользователем f.7, 25 май 2007.

  1. f.7

    f.7 Гость

    Здраствуйте, вот хочу в одном направление покапаться, но даж не знаю с чего начать.
    Вообщем хочу научится делать следующее:
    получить контроль над другими приложениями, тоесть например есть какое-то приложение допустим TotalComander и вот мне надо из моего приложение нажать на кнопку или ввести текст в поле для ввода тотала. Или допустим есть какаято прилага с ListBox и мне надо скопировать всю содержимую инфу от туда, а если там есть и текстбокс, то от туда эту инфу копирнуть в буфер.
    Прозьба не предлогать програмно нажимать мышкой вызывать контекстное меню и т.д., я это уже делал(могу даж поделиться исходниками - если кому надо) но мне организация работы не понравилась, так как приходилось чтобы прилага, в которую я посылаю данные, была видна на экране.
    Есть ли у кого какие предложения или опыт по данному вопросу?
     
  2. Pasha

    Pasha Гость

    В общем случае - нельзя без поддержки со стороны приложения.

    Темную сторону силы в тебе я чую. Власти над другими приложениями желаешь.
     
  3. f.7

    f.7 Гость

    Для: Pasha
    <!--QuoteBegin-Pasha+25:05:2007, 19:33 -->
    <span class="vbquote">(Pasha @ 25:05:2007, 19:33 )</span><!--QuoteEBegin-->Темную сторону силы в тебе я чую. Власти над другими приложениями желаешь.
    [snapback]67146" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    ну вобщем, то что это сторона тёмная - это ты не прогодал ;) , очень жаль конечно что нельзя :( , идея токава, чтобы из другой прилаги скопирнуть инфу, ну например какую-нить базу к которой просто так не подконектишься, а так взял и копируй по одной записи ;)
     
  4. Pasha

    Pasha Гость

    А может это мегаприложение поддерживает COM/COM+? или хотя бы DDE?
     
  5. f.7

    f.7 Гость

    Мега приложение моё или то откуда нато скачать?, моё нет - а то незнаю, обычная прилага с базой.
     
  6. NikSoft

    NikSoft Гость

    Для: f.7
    Почему бы не попробовать Reflection?
     
  7. Pasha

    Pasha Гость

    <!--QuoteBegin-NikSoft+28:05:2007, 06:28 -->
    <span class="vbquote">(NikSoft @ 28:05:2007, 06:28 )</span><!--QuoteEBegin-->Почему бы не попробовать Reflection?
    [snapback]67223" rel="nofollow" target="_blank[/snapback]​
    [/quote]Ну и как с помощью Reflection нажать на кнопку в приложении, написанном на дельфи?
     
  8. mms

    mms Гость

    Сенд мессадж, хуки и винапи часто творят чудеса ;)
     
  9. Pasha

    Pasha Гость

    Для: mms
    Сенд мессадж не подходит.
     
  10. f.7

    f.7 Гость

    Для: NikSoft
    <!--QuoteBegin-NikSoft+28:05:2007, 07:28 -->
    <span class="vbquote">(NikSoft @ 28:05:2007, 07:28 )</span><!--QuoteEBegin-->Почему бы не попробовать Reflection?
    [snapback]67223" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    а по поподробнее можно? и расскажите плиз про сенд мессадж, просто думаю в будущем пригодиться и нетьлько мне, так хоть как нибудь, вот как я это делал
    Код (Text):
    namespace MouseClick
    {
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }

    //импортируем mouse_event():
    [DllImport("User32.dll")]
    static extern void mouse_event(MouseFlags dwFlags, int dx, int dy, int dwData, UIntPtr dwExtraInfo);
    //для удобства использования создаем перечисление с необходимыми флагами (константами), которые определяют действия мыши:
    [Flags]
    enum MouseFlags
    {
    Move=0x0001,
    LeftDown=0x0002,
    LeftUp=0x0004,
    RightDown=0x0008,
    RightUp=0x0010,
    Absolute=0x8000
    };
    //и использование
    const int x = 1000;
    const int y = 3000;
    const int x2 = 16000;
    const int y2 = 3000;
    const int x3 = 21000;
    const int y3 = 6500;
    const int x4 = 21500;
    const int y4 = 8000;

    Process realty = null;
    IntPtr hWndNotepad;
    private void button1_Click(object sender, EventArgs e)
    {
    SearchProcess();
    DataSet dataSet = new DataSet();
    dataSet.ReadXml(@"C:\Центральный.xml");
    DataTable dataTable = dataSet.Tables[0];
    string[] low = new string[dataTable.Rows.Count];
    int col=0;
    foreach (DataRow row in dataTable.Rows)
    {
    low[col]= row[0].ToString();
    col++;
    }
    for (int i=0; i<col; i++)
    {
    Thread.Sleep(500);
    mouse_event(MouseFlags.Absolute | MouseFlags.Move, x, y, 0, UIntPtr.Zero);
    mouse_event(MouseFlags.Absolute | MouseFlags.LeftDown, x, y, 0, UIntPtr.Zero);
    mouse_event(MouseFlags.Absolute | MouseFlags.LeftUp, x, y, 0, UIntPtr.Zero);
    SendKeys.SendWait(low[i]);
    Thread.Sleep(1500);
    mouse_event(MouseFlags.Absolute | MouseFlags.Move, x2, y2, 0, UIntPtr.Zero);
    mouse_event(MouseFlags.Absolute | MouseFlags.LeftDown, x2, y2, 0, UIntPtr.Zero);
    mouse_event(MouseFlags.Absolute | MouseFlags.LeftUp, x2, y2, 0, UIntPtr.Zero);
    }
    }

    //Экспортируем нужные Win32 функции
    [DllImport("User32.dll")]
    static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("User32.dll")]
    static extern int SetForegroundWindow(IntPtr hWnd);

    private void SearchProcess()
    {
    Process[] ppp = Process.GetProcesses();
    foreach (Process p in ppp)
    {
    if (p.ProcessName == "realty")
    {
    realty = p;
    }
    }
    hWndNotepad = realty.MainWindowHandle;
    SetForegroundWindow(hWndNotepad);
    }

    private void button2_Click(object sender, EventArgs e)
    {
    }
    }
    }

    Вот обратите внимание на это
    Код (Text):
    SendKeys.SendWait(low[i]);
    тоесть получается я эмулирую нажатие на текст бокс, после чего он делается активним и с помощью вышенаписанной строки, отправляю туда текст, а как например мне считать данные из этого текстбокса?
    Все ограничения которые я ставил
    <!--QuoteBegin-Pasha+28:05:2007, 12:31 -->
    <span class="vbquote">(Pasha @ 28:05:2007, 12:31 )</span><!--QuoteEBegin-->Проcьба не предлогать програмно нажимать мышкой вызывать контекстное меню
    [snapback]67256" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    - я снимаю, подскажите хоть что-нибудь..

    <!--QuoteBegin-Pasha+28:05:2007, 10:11 -->
    <span class="vbquote">(Pasha @ 28:05:2007, 10:11 )</span><!--QuoteEBegin-->Ну и как с помощью Reflection нажать на кнопку в приложении, написанном на дельфи?
    [snapback]67238" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Извиняюсь, я может не правильно вырозился, задачей является считать данные, а нажатие кнопки это как одно из решений которое я употребил в моём конкретном случае, мне повезло и меня это спасло, но боюсь что это решение не всегда мне поможет.. :rolleyes:
     
  11. mms

    mms Гость

    Опишите конкретнее что надо сделать :rolleyes:
     
  12. NikSoft

    NikSoft Гость

  13. f.7

    f.7 Гость

    <!--QuoteBegin-mms+28:05:2007, 14:14 -->
    <span class="vbquote">(mms @ 28:05:2007, 14:14 )</span><!--QuoteEBegin-->Опишите конкретнее что надо сделать
    [snapback]67269" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    <!--QuoteBegin-f.7+25:05:2007, 18:02 -->
    <span class="vbquote">(f.7 @ 25:05:2007, 18:02 )</span><!--QuoteEBegin-->например есть какое-то приложение допустим TotalComander и вот мне надо из моего приложение нажать на кнопку или ввести текст в поле для ввода тотала. Или допустим есть какаято прилага с ListBox и мне надо скопировать всю содержимую инфу от туда, а если там есть и текстбокс, то от туда эту инфу копирнуть в буфер.
    [snapback]67141" rel="nofollow" target="_blank[/snapback]​
    [/quote]
     
  14. NikSoft

    NikSoft Гость

  15. f.7

    f.7 Гость

    <!--QuoteBegin-mms+28:05:2007, 14:14 -->
    <span class="vbquote">(mms @ 28:05:2007, 14:14 )</span><!--QuoteEBegin-->Опишите конкретнее что надо сделать
    [snapback]67269" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    <!--QuoteBegin-f.7+25:05:2007, 18:02 -->
    <span class="vbquote">(f.7 @ 25:05:2007, 18:02 )</span><!--QuoteEBegin-->например есть какое-то приложение допустим TotalComander и вот мне надо из моего приложение нажать на кнопку или ввести текст в поле для ввода тотала. Или допустим есть какаято прилага с ListBox и мне надо скопировать всю содержимую инфу от туда, а если там есть и текстбокс, то от туда эту инфу копирнуть в буфер.
    [snapback]67141" rel="nofollow" target="_blank[/snapback]​
    [/quote]
     
  16. Pasha

    Pasha Гость

    Для: f.7
    Есть замечательные функции WinAPI FindWindow и SendMessage. Нашел окно текстбокса, послал ему WM_GETTEXTLENGTH, выделил буффер нужного размера, послал WM_GETTEXT.
    Имя и класс окна можно посмотреть утилитой Spy++ (идет со студией).
     
  17. NikSoft

    NikSoft Гость

  18. f.7

    f.7 Гость

    Для: Pasha
    <!--QuoteBegin-Pasha+28:05:2007, 14:41 -->
    <span class="vbquote">(Pasha @ 28:05:2007, 14:41 )</span><!--QuoteEBegin-->Есть замечательные функции WinAPI FindWindow и SendMessage. Нашел окно текстбокса, послал ему WM_GETTEXTLENGTH, выделил буффер нужного размера, послал WM_GETTEXT.
    Имя и класс окна можно посмотреть утилитой Spy++ (идет со студией).
    [snapback]67281" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    Паша ты обсалютно прав, вот эту бодягу я гдето и видел , вроде как это то что мне нужно, расскажи плиз по подробнее и если можно с примерами, бо с API я не силен, всё что использовал - это то , что нарыл в инете
     
  19. Pasha

    Pasha Гость

    Мегакласс-обертка: http://www.gotdotnet.com/Community/UserSam...3B-81F266CE8DE2 (You googling skill increased to 251).
    Добавляешь его в свой проект. в свойствах проекта выставляешь Build/Allow unsafe code.
    Пишешь мегакод:
    Код (Text):
    using System;
    using Win32Util;
    using System.Runtime.InteropServices;

    namespace SendMessageSample
    {
    class Program
    {
    const int WM_SETTEXT = 0x000C;
    static void Main(string[] args)
    {
    Win32Window calculatorWindow = Win32Window.FindWindow("SciCalc", null);
    Win32Window editWindow = calculatorWindow.FindChild("Edit", null);

    string textToSet = "OMGWTF";
    IntPtr textPointer = Marshal.StringToHGlobalAnsi(textToSet);
    editWindow.SendMessage(WM_SETTEXT, 0, textPointer.ToInt32());
    Marshal.FreeHGlobal(textPointer);
    }
    }
    }
    Запускаешь калькулятор, потом пример.

    UPD: память надо освобождать :rolleyes:
     
  20. f.7

    f.7 Гость

    Для: Pasha
    Спасибо тебе большое - выручил, а так же спасибо всем кто откликнулся.
    Для: Pasha
    слушай а ты пиво пьешь? :rolleyes:
     
Загрузка...

Поделиться этой страницей