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

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

Pasha

Для: f.7
Обертка - это класс, в котором для каждого [snapback]67445" rel="nofollow" target="_blank[/snapback]</div>[/quote]
А мужики то не знают...
Ну загрузишь ты тип контрола, найдешь нужное тебе свойство, найдешь его сеттер. Дальше что? что передавать первым параметром в Invoke?

Можно найти класс, унаследованный от Application, создать его в отдельном домене, запустить...но это налагает неприятное ограничение - программа должна запускатся через "управлятор".
 
N

NikSoft

Для: f.7
Тогда не лезь в дебри а начни с простого:как устроена Windows,принципы ее работы
 
F

f.7

Да ты с юмором :) , я на форуме я и задаю вопросы чтоб на них конкретно отвечали, вон гляни на мессаги Pash`ы, что не мессага то ссылка или кодярник, хоть есть куда копать
 
F

f.7

Слово есть слово, в первую очередь NikSoft, потом обязателно Pash`е.....
 
P

Pasha

sax_ol-у, за то что подходил и пинал меня со словами "ну, давай, отпишись" :)
 
F

f.7

<!--QuoteBegin-Pasha+29:05:2007, 14:58 -->
<span class="vbquote">(Pasha @ 29:05:2007, 14:58 )</span><!--QuoteEBegin-->за то что подходил и пинал меня со словами "ну, давай, отпишись"
[snapback]67456" rel="nofollow" target="_blank[/snapback]​
[/quote]
да рассмешили, Sax_ol - а ты пиво пьешь? :)
 
F

f.7

339210048 - стучи, бери своего коллегу по работе(я думаю ты догодался кого) и как нить на выходных надо встретиться, мне очень интерестно будет вас увидеть и поговорить
 
F

f.7

Добрый день,
Вот немного разобрался я с API, но возник баг с которым не могу разобраться, гляньте кому не лень.
Значит так, вот хочу в окне Qip в поле для ввода сообщения нажать мышкой, так вот SPY++ смотрю иерархию и натыкаюсь на следуещее (в файлике), тап молучается на одном контроле лежат 2 контрола с одинаковым именем класса, как выбрать правильный?
вот код
Код:
private void button1_Click(object sender, EventArgs e)
{
IntPtr qipWindow = FindWindow("TMsgForm", "[339-210-048] - Окно сообщений");
if (qipWindow == IntPtr.Zero)
{
MessageBox.Show("Not found qipWindow");
return;
}
//Вот тут наверное выбирается первый на рисунке а надо второй
IntPtr tPanel = FindWindowEx(qipWindow, IntPtr.Zero, "TPanel", null);
if (tPanel == IntPtr.Zero)
{
MessageBox.Show("Not found tPanel");
return;
}
//Вот тут у меня и не ищеться контрол
IntPtr TPageControlEx = FindWindowEx(tPanel, IntPtr.Zero, "TPageControlEx", null);
if (TPageControlEx == IntPtr.Zero)
{
MessageBox.Show("Not found TPageControlEx");
return;
}
//IntPtr nul = IntPtr.Zero;
int retValue;
retValue = SendMessage(TRichViewEdit, WM_RBUTTONDOWN, nul, nul);
retValue = SendMessage(TRichViewEdit, WM_RBUTTONUP, nul, nul);

я так понимаю что просто ввыберается не тот tPanel тоесть выбирается первый на рисунке а надо второй , как выбрать мне нужный?
 

Вложения

  • untitled.bmp
    683,5 КБ · Просмотры: 625
  • untitled.rar
    12,4 КБ · Просмотры: 173
P

Pasha

Все зависит от того, что ты подразумеваешь под "нужный"
Если нужный - это "TPageControlEx в TPanel", то примерно так:
Код:
			IntPtr tPanel = FindWindowEx(qipWindow, IntPtr.Zero, "TPanel", null);
if (tPanel == IntPtr.Zero)
{
MessageBox.Show("Not found tPanel");
return;
}

IntPtr TPageControlEx = IntPtr.Zero;
do
{
IntPtr TPageControlEx = FindWindowEx(tPanel, IntPtr.Zero, "TPageControlEx", null);
tPanel = FindWindowEx(qipWindow, tPanel, "TPanel", null);
}
while (TPageControlEx == IntPtr.Zero && tPanel != IntPtr.Zero);

if (TPageControlEx == IntPtr.Zero)
{
MessageBox.Show("Not found TPageControlEx");
return;
}
Примерно, не проверял :D
 
F

f.7

Для: Pasha
работает, СПАСИБА большое, сколько мне сообщений набрать? чтоб те репутацию пповысить за активную и оперативную помощь? :D
 
P

Pasha

Да вроде как сразу можно повышать. С ограничением не больше одного плюса конкретному пользователю в неделю. :D
 
E

etc

Для: f.7
еще есть и такая замечательная штука: EnumChildWindows
 
F

f.7

Для: Pasha
Все получилось, ты уж извини но меня два вопросика волнует ой как сильно, а вот сделать не могу
Код:
private void button1_Click(object sender, EventArgs e)
{
IntPtr qipWindow = FindWindow("TMsgForm", "[339-210-048] - Окно сообщений");
if (qipWindow == IntPtr.Zero)
{
MessageBox.Show("Not found qipWindow");
return;
}

IntPtr tPanel = FindWindowEx(qipWindow, IntPtr.Zero, "TPanel", null);
if (tPanel == IntPtr.Zero)
{
MessageBox.Show("Not found tPanel");
return;
}

IntPtr TPageControlEx = IntPtr.Zero;
do
{
TPageControlEx = FindWindowEx(tPanel, IntPtr.Zero, "TPageControlEx", null);
tPanel = FindWindowEx(qipWindow, tPanel, "TPanel", null);
}
while (TPageControlEx == IntPtr.Zero && tPanel != IntPtr.Zero);

if (TPageControlEx == IntPtr.Zero)
{
MessageBox.Show("Not found TPageControlEx");
return;
}

IntPtr TTabSheet = FindWindowEx(TPageControlEx, IntPtr.Zero, "TTabSheet", null);
if (TTabSheet == IntPtr.Zero)
{
MessageBox.Show("Not found TTabSheet");
return;
}



IntPtr tPanel2 = FindWindowEx(TTabSheet, IntPtr.Zero, "TPanel", null);
if (tPanel2 == IntPtr.Zero)
{
MessageBox.Show("Not found tPanel2");
return;
}

IntPtr TRichViewEdit = IntPtr.Zero;
do
{
TRichViewEdit = FindWindowEx(tPanel2, IntPtr.Zero, "TRichViewEdit", null);
tPanel2 = FindWindowEx(TTabSheet, tPanel2, "TPanel", null);
}
while (TRichViewEdit == IntPtr.Zero && tPanel != IntPtr.Zero);

if (TRichViewEdit == IntPtr.Zero)
{
MessageBox.Show("Not found TRichViewEdit");
return;
}
IntPtr nul = IntPtr.Zero;
int retValue;
retValue = SendMessage(TRichViewEdit, WM_RBUTTONDOWN, nul, nul);
retValue = SendMessage(TRichViewEdit, WM_RBUTTONUP, nul, nul);
}





[DllImport("user32.dll", EntryPoint="FindWindow")]
private static extern IntPtr FindWindow(string _ClassName, string _WindowName);

[DllImport("user32.dll", EntryPoint="FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndPrnt, IntPtr hwndChildAfter, string _ClassName, string _WindowName);

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
const int WM_LBUTTONDOWN = 513;
const int WM_LBUTTONUP = 514;
const int WM_RBUTTONDOWN = 516;
const int WM_RBUTTONUP = 517;
вот полностью код который нажимает на поле, для ввода текста в QIP, правую кнопку мыши тем самым вызываю меню:
1. как мне нажать пункт меню - ведь SPY++ его не показывает
2. как из текстБокса получить текс? я знаю что это GetText, но вот как это использовать совсем не знаю, не подскажешь?
 
F

f.7

<!--QuoteBegin-etc+8:06:2007, 18:34 -->
<span class="vbquote">(etc @ 8:06:2007, 18:34 )</span><!--QuoteEBegin-->еще есть и такая замечательная штука: EnumChildWindows
[snapback]68699" rel="nofollow" target="_blank[/snapback]​
[/quote]
поподробнее пожалуста...
 
P

Pasha

<!--QuoteBegin-f.7+8:06:2007, 18:37 -->
<span class="vbquote">(f.7 @ 8:06:2007, 18:37 )</span><!--QuoteEBegin-->вот полностью код который нажимает на поле, для ввода текста в QIP, правую кнопку мыши тем самым вызываю меню:
1. как мне нажать пункт меню - ведь SPY++ его не показывает
[snapback]68701" rel="nofollow" target="_blank[/snapback]​
[/quote]
Меню - это не совсем окна. Почитай MSDN по сообщениям WM_ENTERMENULOOP/WM_EXITMENULOOP/WM_MENUCOMMAND. И по функции GetMenu. Ну и вообще весь раздел про меню. :D

Конкретно в qip работа с меню нестандартная. Это порождение дельфи невидимое окно с классом TPUtilWindow, и при нажатии кнопки вызывает для него меню. Вобщем, открываешь в Spy++ логгинг сообщений, настраиваешь его на окно qip, включаешь Windows of the same process. Делаешь нужные тебе действия. Потом смотришь на лог, и повторяешь те же сообщения в коде.

<!--QuoteBegin-f.7+8:06:2007, 18:37 -->
<span class="vbquote">(f.7 @ 8:06:2007, 18:37 )</span><!--QuoteEBegin-->2. как из текстБокса получить текс? я знаю что это GetText, но вот как это использовать совсем не знаю, не подскажешь?
[snapback]68701" rel="nofollow" target="_blank[/snapback]​
[/quote]

Код:
[ DllImport("user32.dll") ]
static extern int GetWindowText(int hWnd, StringBuilder text, int count);
...
const int nChars = 256;
StringBuilder buff = new StringBuilder(nChars);

if ( GetWindowText(handle, buff, nChars) > 0 )
{
text = buff.ToString();
}
 
Мы в соцсетях:

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