Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.07;
Скачать: CL | DM;

Вниз

Перехват значений   Найти похожие ветки 

 
Valeron   (2002-01-10 05:43) [0]

Привет мастера!
Есть такая задача. Существует программа, которая успешно используется, но к сожалению нет ее исходников, а автор тоже
куда-то пропал. Понадобилось немного расширить ее функционал.
В связи с этим возникла проблема:
требуется брать значение из некоторого поля некоторой формы чужой программы, для того, чтобы в дальнейшем его обработать
в своей программе.
Может кто сталкивался с подобной задачей. Помогите,пожалуйста,
советом, ссылкой или может есть кусок кода? Облегчит ли задачу,
если в нужном поле будет фокус или требуемое значение будет
выделено?


 
Bizon ©   (2002-01-10 08:52) [1]

Я думаю, что если в нужном поле будет фокус, то посылая сообщения для этого окна, можно скопировать значение в буфер, а затем делай с ним что хочешь.


 
Valeron   (2002-01-10 09:36) [2]

>Bizon

А можешь показать как это будет выглядеть в коде?


 
Bizon ©   (2002-01-10 09:46) [3]

Если на C++ Builder подойдет?


 
Valeron   (2002-01-10 09:51) [4]

>Bizon

Да.


 
Bizon ©   (2002-01-10 10:04) [5]

С начала тебе нужно получить Hwnd нужного тебе окна:
bool __stdcall EnumProc(HWND hWnd,/*LPARAM*/long/*lp*/)
{
unsigned long* pPid; //LPDWORD
unsigned long result; //DWORD
void *hg; //HGLOBAL


if(hWnd==NULL)
return false;

hg = GlobalAlloc(GMEM_SHARE,sizeof(unsigned long));
pPid = (unsigned long *)GlobalLock(hg);

result = GetWindowThreadProcessId(hWnd,pPid);

if(result){
char title[8];
char className[95];
GetClassName(hWnd,className,95);
GetWindowText(hWnd,title,8);
if (strcmp(title,"Session")==NULL){
myhWnd=hWnd; }

}
else{
GlobalUnlock(hg);
GlobalFree(hg);
return false;
}
GlobalUnlock(hg);
GlobalFree(hg);
return true;
}

А затем посылать сообщения:
keybd_event( VK_SHIFT,0,KEYEVENTF_EXTENDEDKEY | 0,0 );
keybd_event( VK_END,0,KEYEVENTF_EXTENDEDKEY | 0,0 );
keybd_event( VK_END,0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
keybd_event( VK_SHIFT,0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);

Это ты выделил текст
Дальше
keybd_event( VK_CONTROL,0,KEYEVENTF_EXTENDEDKEY | 0,0 );
keybd_event( VK_INSERT,0,KEYEVENTF_EXTENDEDKEY | 0,0 );
keybd_event( VK_INSERT,0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);
keybd_event( VK_CONTROL,0,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0);

Это ты скопировал значение в буфер.
Теперь делай с ним что хочешь.
Может быть кто-нибудь дополнит или поправит, если что не так.
Удачи.


 
Valeron   (2002-01-10 10:06) [6]

>Bizon

Большое спасибо за пример! Буду разбираться!


 
Bizon ©   (2002-01-10 10:12) [7]

Прошу прощения, я немного напутал.
С помощью keybd_event сообщения будут приходить к активному окну. Поэтому лучше отправлять сообщения окну myHwnd с помощью sendmessage.


 
Bizon ©   (2002-01-10 10:25) [8]

Вообще поясню, что было у меня.
Нужно было сделать так, чтобы по нажатию какой-нибудь клавиши из определенного окна с именем "Session", как в примере, брались какие-то значения и вставлялись в другое место. Поэтому я написал HOOK. dll-ка отслеживала нажатие клавиши, в нашем окне. Для этого и требовалось найти нужное окно (первая функия). Активным оставалось окно с именем "Session", поэтому я пользовался keybd_event, копировал в буфер, перемещался и вставлял из буфера.
У тебя другой случай.
Твоя прога должна найти нужное окно и послать ему сообщения, чтобы скопировать в буфер требуемое значение.


 
Valeron   (2002-01-10 10:37) [9]

>Bizon

Еще раз спасибо!


 
Bizon ©   (2002-01-10 11:52) [10]

А вот такой код получился на Delphi.
У тебя есть окно с именем Test.
Оно может быть свернуто или нет, но до того как оно стало не активным, фокус должен стоять на нужном поле.
Нажимаешь на кнопку, у тебя в буфере значение из поля, на котором был фокус в окне Test. Вставляешь куда надо. Работает - проверял.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var myHwnd: HWND;
begin
myHwnd:=findwindow(nil, "Test");
if myHwnd=0 then showmessage ("


 
nikkie ©   (2002-01-10 12:15) [11]

наворочено...
используй WM_GETTEXTLENGTH, WM_GETTEXT
код есть здесь
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1010050400&n=5


 
Valeron   (2002-01-10 12:37) [12]

Спасибо всем!



Страницы: 1 вся ветка

Текущий архив: 2002.03.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.014 c
1-19228
dart
2002-02-19 12:21
2002.03.07
Один вопрос... :)


3-19106
klnyaz17
2002-02-08 15:07
2002.03.07
Где просмотреть поле значения которого представляют собой HTML страницы?


1-19123
Andreyka
2002-02-20 19:58
2002.03.07
Вопросец про кнопки


1-19177
1g0r
2002-02-21 19:06
2002.03.07
Ошибка ~Control has no parent window~ помогите разобраться почему


1-19192
cypher
2002-02-17 21:13
2002.03.07
NetFileEnum