Достъп до поле в друга програма
13 отговора
0 прегледа
Достъп до поле в друга програма
Чудя се дали има начин една програма да може да чете от поле в друга програма, по-точно да може да енумерира всички widget-i на даден прозорец и вземе стойност от някой от тях.
Re: Достъп до поле в друга програма
Има. Даже можеш да променяш текст или нещо др. в чуждата програма без да имаш сорс кода и. Един от възм. варианти е този:
- Извикваш FindWindow() и GetClientRect(), защото върнатите параметри от тях ще са ти входни за callback ф-ята EnumChildWindows() с която да обходиш всички елементи от даден прозорец. Имам някакъв спомен, че ако имаш радиогрупа например, но за да намериш/промениш статуса на определен ел-т, първо получаваш хендъла на групата и след това циклично обхождаш отд. ел-ти от групата, догато намериш търсения. Щом намериш хендъла му с GetDlgCtrlID() можеш да го промениш със SendMessage()
- Извикваш FindWindow() и GetClientRect(), защото върнатите параметри от тях ще са ти входни за callback ф-ята EnumChildWindows() с която да обходиш всички елементи от даден прозорец. Имам някакъв спомен, че ако имаш радиогрупа например, но за да намериш/промениш статуса на определен ел-т, първо получаваш хендъла на групата и след това циклично обхождаш отд. ел-ти от групата, догато намериш търсения. Щом намериш хендъла му с GetDlgCtrlID() можеш да го промениш със SendMessage()
Re: Достъп до поле в друга програма
Мерси. Пробвах с enumchildwindows, ама нещо забива гадната функция и не връща обяснение за грешката. Доколкото разбирам ме насочваш към функцийките в win32gui. Преди доста време ги бях ползвал за намиране на определен прозорец, сега ще трябва да се разровя повечко.
Re: Достъп до поле в друга програма
Win32 API
ама пак си е голям gui. На какъв език пишеш?
Re: Достъп до поле в друга програма
Метни един поглед на [линк].
Специално за IE и FF това и това са класика.
Специално за IE и FF това и това са класика.
Re: Достъп до поле в друга програма
За съжаление не ми трябва за експлорър или файрфокс, иначе ruby си е готин отвсякъде. Засега пробвам с уин32гуи, обаче, нещо зациклих. С enumchildwindows
стигам до последните джамове и оттам нататък вече са контролите. Обаче, за да имаш достъп до даден контрол всички функции искат id на контрол-а, а откъде да му знам ид-то? Няма и функция за енумираране на контроли ...
стигам до последните джамове и оттам нататък вече са контролите. Обаче, за да имаш достъп до даден контрол всички функции искат id на контрол-а, а откъде да му знам ид-то? Няма и функция за енумираране на контроли ...
Re: Достъп до поле в друга програма
Декларация на ф-ята:
BOOL CALLBACK EnumChildProc(HWND hwndChild, LPARAM lParam);
Примерна дефиниция:
Кодът е С++ Буилдер, но специфичния за него код е закоментарен. Този код проверява дали, едно чекмарк поле има отметка. Дано в бързината да не съм изтрил нещо съществено.
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;
}
Кодът е С++ Буилдер, но специфичния за него код е закоментарен. Този код проверява дали, едно чекмарк поле има отметка. Дано в бързината да не съм изтрил нещо съществено.
Re: Достъп до поле в друга програма
а що реши, че човека пита за виндовс?
обикновено виндовс програмистите не използват думичката widget.
обикновено виндовс програмистите не използват думичката widget.
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);
}
}
Можеш да си направиш масив с контролите от даден клас и да ги достъпваш с индекс или да ги намираш по текст (ако имат).
Re: Достъп до поле в друга програма
Тази дума едно време я използваха Win16 API програмистите, които използваха VB контроли. Срещал съм я и в букварите за 16/32 битовите версии на OWL на Борланд. Не, че има кой знае какво значение де.
Re: Достъп до поле в друга програма
Теглиш Greatis WinDowse и виждаш кой "widget" ти трябва, след това само FindWindow и FindWindowEx...
Re: Достъп до поле в друга програма
Големият проблем е, че дали може да се вземе стойност от полето, страшно много зависи от неговия тип. Например, счупих се да пробвам и търся начин за "syslistview32" и се оказва, че sendmessage работи при тоя тип само в същия процес, което много усложнява нещата.