Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2011, 17:27   #11
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

надо покумекать )
fate вне форума Ответить с цитированием
Старый 15.08.2011, 17:35   #12
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

fate, вся загвоздка с
Код:
SendMessage(hw,MY_MESSAGE,0,DWord(ParamStr(1)));
Отправка и прием работают.

Пробовал так:
Код:
procedure Tcdpmain.FormActivate(Sender: TObject);
var w:thandle;
begin
w:=CreateMutex(nil, false, 'CodepadApp');
if (GetLastError=ERROR_ALREADY_EXISTS) or(GetLastError=ERROR_ACCESS_DENIED) then
begin
 w := FindWindow('Tcdpmain',nil);
  if w<>0 then
       if paramcount>0 then
       begin
       SendMessage(w,MY_MESSAGE,0,DWord(ParamStr(1)));
       end;
 Application.Terminate;     
 Exit;
end else
begin
if paramcount>0 then begin FullOpen(ParamStr(1)); end else SetFocus;
end;
Эффект тот же.

Последний раз редактировалось kettanaito; 15.08.2011 в 17:52.
kettanaito вне форума Ответить с цитированием
Старый 15.08.2011, 21:28   #13
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

Цитата:
вся загвоздка с
вся загвоздка в получении хендла нужного окна
попробовал такой вариант:
Код:
.......................
const MY_MESSAGE = WM_USER + 4242;
function enum(hd:hwnd;Lparam:Lparam):boolean;stdcall;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Timer1: TTimer;
    procedure FormActivate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    procedure ReceiveMessage (var Msg: TMessage); message MY_MESSAGE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  HandleForm:HWND;
implementation


var
  HM: THandle;

{$R *.dfm}

function enum(hd:hwnd;Lparam:Lparam):boolean;
var name:array[0..255] of char;
begin
FillChar(name,SizeOf(name),#0);
if IsWindowVisible(hd) then begin
  SendMessage(hd,WM_GETTEXT,SizeOf(name),Longint(@name));
  if (name=form1.Caption) and(hd<>Lparam) then
    HandleForm:=hd;

end;
result:=true;
end;

function Check: boolean;
begin
  HM := OpenMutex(MUTEX_ALL_ACCESS, false, 'CdpApp');
  Result := (HM <> 0);
  if HM = 0 then
   HM := CreateMutex(nil, false, 'CdpApp');
end;

procedure TForm1.ReceiveMessage(var Msg: TMessage);
var str:string;
begin
 label2.Caption:=label2.Caption+char(msg.lParam); //как оказалось передать полностью строку нельзя
//я предполагаю это потому что адрес указывает на место в одном АП процесса а мы передаем в другое приложение
//по этому я передаю посимвольно в цикле
// form1.Repaint;
end;

procedure TForm1.FormActivate(Sender: TObject);
var hw:HWND; i:integer; str:string;
begin

enumwindows(@enum,Handle);
label1.Caption:=inttostr(HandleForm);
label3.Caption:='Handle='+inttostr(Handle)+#13+#10+'Application.Handle='+inttostr(Application.Handle); // для инфы

str:=ParamStr(1);
  if Check=True then
  begin
  if HandleForm<>0 then begin
    for i:=0 to length(str) do begin
      SendMessage(HandleForm,MY_MESSAGE,0,ord(str[i]));
      end;
   end else
    ShowMessage('хендл не найден');
 // close;
  end;

end;
и даже работает, но не всегда ((
например если запускать из делфи (F9) то все передается прекрасно. А вот если запускать exe тут проблема. Начал копаться, оказалось у окна находит 2 хендл, я без понятия как такое может быть.

чуть переделал код:
Код:
if (name=form1.Caption) then begin//and(hd<>Lparam) then
    form1.label2.Caption:=form1.label2.Caption+name+' handle='+inttostr(hd)+#13#10;
    end;
в итоге выдает 2 разных хендла и 2 одинаковых заголовка (заголовок формы)
Такое случается если запускать exe, если же запускать из делфи то работает как надо.
Вот поэтому и не пашет, посылается сообщение на непонятный хендл.
Может кто-нить объяснит почему такое происходит?

Последний раз редактировалось fate; 15.08.2011 в 21:31.
fate вне форума Ответить с цитированием
Старый 15.08.2011, 21:38   #14
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,305
По умолчанию

ХЗ Может я идиот, ибо нефига не понимаю в Delphi и с трудом понимаю о чем вообще речь. Но ляпну наобум: А что если залить инфу о хэндле окна в которое посылается сообщение записать в некий файлик, а оттуда считать эту инфу в некий буферный хэндл и именно буфер кидать в SendMessage?
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 15.08.2011, 21:55   #15
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

MooNDeaR как вариант, это у ТС надо спросить подойдет ему такой вариант или нет. можно в реестр писать, что бы файлы не пладить
fate вне форума Ответить с цитированием
Старый 15.08.2011, 22:08   #16
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

MooNDeaR, в целом идея подойдет, т.к. с программой и так работает несколько файлов. Но я никогда не работал с реестром, чтобы как-либо записать хендл в него. Как это сделать без реестра, в обычный файл?

fate, пробовал твой код. У меня не работает почему-то. Сам возился, пробовал через процессы как-то сделать, но не вышло (я получаю handle процесса окна моей программы, но это все еще то второе окно, а не первое).

Последний раз редактировалось kettanaito; 15.08.2011 в 22:14.
kettanaito вне форума Ответить с цитированием
Старый 15.08.2011, 22:32   #17
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,305
По умолчанию

Цитата:
Как это сделать без реестра, в обычный файл?
Ну вообще у Хэндла же есть параметры? По крайней мере должны быть
Вот ты все значения этих параметров запиши в некий файлик текстовый, а потом считай данные в таком же порядке преобразуя к нужным типам
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.
MooNDeaR вне форума Ответить с цитированием
Старый 15.08.2011, 22:42   #18
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

MooNDeaR, у него нет параметров. Впрочем, я уже разобрался. Его можно записать в тот же INI как последовательность цифр. Считывается тоже хорошо.

Код:
var cini:tinifiles;
...
procedure Tcdpmain.FormActivate(Sender: TObject);
var hw:HWND; w,prc:thandle; hnd:HWND; s:integer;
begin
cini:=tinifile.Create('D:\Cdp.ini'); 
// Строка Handle в INI-файле пуста при условии, что это первый запуск
if cini.ReadInteger('Cdp','Handle',0)=0 then cini.WriteInteger('Cdp','Handle',Handle);
s:=cini.ReadInteger('Cdp','Handle',Handle);

if handle<>s then
begin
// При повторном запуске в hnd считается первый Handle окна
hnd:=cini.ReadInteger('Cdp','Handle',Handle);
if paramcount>0 then SendMessage(hnd,MY_MESSAGE,0,DWORD(ParamStr(1)));
Close;
end;
...
procedure Tcdpmain.FormDestroy(Sender: TObject);
begin
cini.WriteInteger('Cdp','Handle',0); // записываю хендл обратно в ноль
cini.free;
end;
Все хорошо, но есть два момента:
1. SendMessage либо отправляет пустой параметр (когда вызываю FullOpen), либо последовательность букв и цифр (если вызвать ShowMessage).
2. Данный код вылетает с ошибкой (из-за первого пункта)

Выяснил, что что-то идет не так во время DWORD(ParamStr(1)) и последующего PChar(msg.LParam).

Последний раз редактировалось kettanaito; 15.08.2011 в 22:54.
kettanaito вне форума Ответить с цитированием
Старый 15.08.2011, 23:02   #19
fate
Форумчанин
 
Аватар для fate
 
Регистрация: 17.03.2009
Сообщений: 318
По умолчанию

Цитата:
Выяснил, что что-то идет не так во время DWORD(ParamStr(1)) и последующего PChar(msg.LParam).
об этом я писал в комментариях в своем коде
fate вне форума Ответить с цитированием
Старый 15.08.2011, 23:11   #20
kettanaito
Веб-дизайнер
Форумчанин
 
Аватар для kettanaito
 
Регистрация: 11.08.2011
Сообщений: 305
По умолчанию

Ура! Все вышло и работает чудесно!
Код:
procedure Tcdpmain.FormActivate(Sender: TObject);
var hw:HWND; w,prc:thandle; hnd:HWND; s:integer;
begin
cini:=tinifile.Create('D:\cdp32.ini');
if cini.ReadInteger('Cdp','Handle',0)=0 then cini.WriteInteger('Cdp','Handle',FindWindow('Tcdpmain',nil))
else hnd:=hnd;
s:=cini.ReadInteger('Cdp','Handle',0);

if handle<>s then
begin
hnd:=cini.ReadInteger('Cdp','Handle',0);
if paramcount>0 then
  begin
  cini.WriteString('Cdp','File',ParamStr(1));
  SendMessage(hnd,MY_MESSAGE,0,0);
  end;
Close;
end else
begin
if paramcount>0 then FullOpen(ParamStr(1));
end;
end;
...
procedure Tcdpmain.ReceiveMessage;
var msg2:string;
begin
FullOpen(cini.ReadString('Cdp','File',ParamStr(1)));
end;
...
procedure Tcdpmain.FormDestroy(Sender: TObject);
var s:integer;
begin
cini:=tinifile.Create('D:\cdp32.ini');
s:=cini.ReadInteger('Cdp','Handle',0);
DragAcceptFiles(Handle, False);
if handle=s then begin
cini.WriteInteger('Cdp','Handle',0);
cini.WriteString('Cdp','File','0');
end else Refresh;
cini.free;
end;
Не слишком рационально, но работает.

Последний раз редактировалось kettanaito; 15.08.2011 в 23:20.
kettanaito вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взаимодействие с игрой saylar_06 Общие вопросы Delphi 13 08.06.2011 14:35
Взаимодействие C# и 1с Sparky Свободное общение 1 05.02.2010 04:31
Взаимодействие приложений artemavd Общие вопросы Delphi 22 01.08.2009 20:09
uTorrent - взаимодействие SoulReaver Win Api 1 21.06.2009 20:06
Взаимодействие с пользователем Alone_Wolf Общие вопросы Delphi 19 23.12.2008 09:34