Достъп до поле в друга програма

13 отговора 0 прегледа
#1

Достъп до поле в друга програма

Чудя се дали има начин една програма да може да чете от поле в друга програма, по-точно да може да енумерира всички widget-i на даден прозорец и вземе стойност от някой от тях.

Отговор
в отговор на lxeos #2

Re: Достъп до поле в друга програма

Има. Даже можеш да променяш текст или нещо др. в чуждата програма без да имаш сорс кода и. Един от възм. варианти е този:
- Извикваш FindWindow() и GetClientRect(), защото върнатите параметри от тях ще са ти входни за callback ф-ята EnumChildWindows() с която да обходиш всички елементи от даден прозорец. Имам някакъв спомен, че ако имаш радиогрупа например, но за да намериш/промениш статуса на определен ел-т, първо получаваш хендъла на групата и след това циклично обхождаш отд. ел-ти от групата, догато намериш търсения. Щом намериш хендъла му с GetDlgCtrlID() можеш да го промениш със SendMessage()

Отговор
в отговор на Beco_ #3

Re: Достъп до поле в друга програма

Мерси. Пробвах с enumchildwindows, ама нещо забива гадната функция и не връща обяснение за грешката. Доколкото разбирам ме насочваш към функцийките в win32gui. Преди доста време ги бях ползвал за намиране на определен прозорец, сега ще трябва да се разровя повечко.

Отговор
в отговор на lxeos #4

Re: Достъп до поле в друга програма

Win32 API ама пак си е голям gui. На какъв език пишеш?

Отговор
в отговор на lxeos #5

Re: Достъп до поле в друга програма

Метни един поглед на [линк].
Специално за IE и FF това и това са класика.

Отговор
в отговор на _Jacky #6

Re: Достъп до поле в друга програма

За съжаление не ми трябва за експлорър или файрфокс, иначе ruby си е готин отвсякъде. Засега пробвам с уин32гуи, обаче, нещо зациклих. С enumchildwindows
стигам до последните джамове и оттам нататък вече са контролите. Обаче, за да имаш достъп до даден контрол всички функции искат id на контрол-а, а откъде да му знам ид-то? Няма и функция за енумираране на контроли ...

Отговор
в отговор на lxeos #7

Re: Достъп до поле в друга програма

Декларация на ф-ята:
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam);

Примерна дефиниция:
//---------------------------------------------------------------------------

BOOL CALLBACK EnumChildProc(HWND hWin, LPARAM lParam)
//---------------------------------------------------------------------------
{
char szCaption[256];
HANDLE h = GetWindow(hWin,GW_CHILD);
while(h)
{ int i = GetDlgCtrlID(h);
if ( i == 0)
{ // some error msg
break;
}
if (0 == GetDlgItemText(hWin,i,szCaption,256))
{ // some error msg
//break;
}

if (0 == strcmp(szCaption,"Configuration"))
{ if (SendMessage(h, BM_GETCHECK, 0, 0) == BST_CHECKED)
{// m_RichEdit1->Lines->Add("Configuration - On");
}
else
{ //m_RichEdit1->Lines->Add("Configuration - Off");
}
}
h = GetWindow(h,GW_HWNDNEXT);
}
return TRUE;
}


Кодът е С++ Буилдер, но специфичния за него код е закоментарен. Този код проверява дали, едно чекмарк поле има отметка. Дано в бързината да не съм изтрил нещо съществено.

Отговор
в отговор на Beco_ #8

Re: Достъп до поле в друга програма

а що реши, че човека пита за виндовс?
обикновено виндовс програмистите не използват думичката widget.

Отговор
в отговор на lxeos #9

Re: Достъп до поле в друга програма

Това обикаля контролите в Run диалога:


BOOL CALLBACK RunDlgCtrlHandler(HWND handle, LPARAM param) {
char txt[500] = "", cls[500] = "", info[1000] = "";

GetWindowText(handle, txt, 499);
GetClassName(handle, cls, 499);
sprintf(info, "text: %s\nclass name: %s", txt, cls);

MessageBox(NULL, info, "", MB_OK);

return TRUE;
}

void ShowRunDlgCtrls() {
HWND run = FindWindow(NULL, "Run");

if (run) {
EnumChildWindows(run, RunDlgCtrlHandler, NULL);
}
}



Можеш да си направиш масив с контролите от даден клас и да ги достъпваш с индекс или да ги намираш по текст (ако имат).

Отговор
в отговор на $%^amp;*()_+~! #10

Re: Достъп до поле в друга програма

Тази дума едно време я използваха Win16 API програмистите, които използваха VB контроли. Срещал съм я и в букварите за 16/32 битовите версии на OWL на Борланд. Не, че има кой знае какво значение де.

Отговор
в отговор на lxeos #11

Re: Достъп до поле в друга програма

Теглиш Greatis WinDowse и виждаш кой "widget" ти трябва, след това само FindWindow и FindWindowEx...

Отговор
в отговор на бaтKoлю #12

Re: Достъп до поле в друга програма

Spy++/WinSight32 ?

Отговор
в отговор на Beco_ #13

Re: Достъп до поле в друга програма

Мдам, същата работа ще свършат...

Отговор
в отговор на бaтKoлю #14

Re: Достъп до поле в друга програма

Големият проблем е, че дали може да се вземе стойност от полето, страшно много зависи от неговия тип. Например, счупих се да пробвам и търся начин за "syslistview32" и се оказва, че sendmessage работи при тоя тип само в същия процес, което много усложнява нещата.

Отговор