Текущий архив: 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