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

  • Автор темы f.7
  • Дата начала
F

f.7

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

Pasha

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

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

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]
ну вобщем, то что это сторона тёмная - это ты не прогодал ;) , очень жаль конечно что нельзя :( , идея токава, чтобы из другой прилаги скопирнуть инфу, ну например какую-нить базу к которой просто так не подконектишься, а так взял и копируй по одной записи ;)
 
P

Pasha

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

f.7

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

NikSoft

Для: f.7
допустим есть какаято прилага с ListBox и мне надо скопировать всю содержимую инфу от туда, а если там есть и текстбокс, то от туда эту инфу копирнуть в буфер.

Почему бы не попробовать Reflection?
 
P

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 нажать на кнопку в приложении, написанном на дельфи?
 
M

mms

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

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]
а по поподробнее можно? и расскажите плиз про сенд мессадж, просто думаю в будущем пригодиться и нетьлько мне, так хоть как нибудь, вот как я это делал
Код:
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)
{
}
}
}


Вот обратите внимание на это
Код:
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:
 
M

mms

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

NikSoft

Для: f.7
Вот ссылка о Reflection
 
F

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]
 
N

NikSoft

Для: f.7
Пример использования Reflection
 
F

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]
 
P

Pasha

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

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 я не силен, всё что использовал - это то , что нарыл в инете
 
P

Pasha

Мегакласс-обертка: (You googling skill increased to 251).
Добавляешь его в свой проект. в свойствах проекта выставляешь Build/Allow unsafe code.
Пишешь мегакод:
Код:
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:
 
F

f.7

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!