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

Вниз

Хелп!! Как из одной моей проги перетащить текст в другу мою прог   Найти похожие ветки 

 
Hero ©   (2007-04-23 04:16) [0]

запустили второй раз мою прогу нужно передать paramstr(1) первой проге


 
Loginov Dmitry ©   (2007-04-23 07:47) [1]

Способов масса.
Один из наиболее простых - сохранить текст во временном текстовом файле, и уведомить об этом первую прогу с помощью SendMessage().


 
Hero ©   (2007-04-23 09:36) [2]

Да спасибо. Я ужо дотумкался до ентого


 
Leonid Troyanovsky ©   (2007-04-23 09:49) [3]


> Loginov Dmitry ©   (23.04.07 07:47) [1]

> текстовом файле, и уведомить об этом первую прогу с помощью
> SendMessage().

Если уж SendMessage, то WM_COPYDATA и никаких файлов.

--
Regards, LVT.


 
oxffff ©   (2007-04-23 10:07) [4]


> Hero ©   (23.04.07 04:16)  
> запустили второй раз мою прогу нужно передать paramstr(1)
> первой проге


По электронной почте.


 
Hero ©   (2007-04-23 13:46) [5]

oxffff ©   (23.04.07 10:07) [4] не смешно
возникла другая промблема
нахожу handle вот таким способом

Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO BEGIN
  IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0) then
  BEGIN
  GetWindowText (Wnd, buff, sizeof (buff ));
  IF StrPas (buff) = application.Title THEN sendmessage(wnd,1025,0,0).......и т.д.

есть обработчик события

procedure GetMes(var mes :TMessage); message 1025;

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


 
Hero ©   (2007-04-23 17:15) [6]

Неужели нет решения этой проблеммы???


 
novill ©   (2007-04-23 17:32) [7]

А ты уверен, что ты его посылаешь? :)


 
novill ©   (2007-04-23 17:33) [8]

Ну и если посылаешь то почему окну с application.Title, а не mauinform.caption


 
Hero ©   (2007-04-24 04:25) [9]


novill ©   (23.04.07 17:33) [8]

Ну и если посылаешь то почему окну с application.Title, а не mauinform.caption


:))) дык я уже давно енто сделал только никак не мог допетрить почему он 2 раза находит мою прогу пока не дотумкался что он находит окно пректа :))))))
вобчем все у меня получилось только результат меня не радует. Суть вот в чем:
я сделал красивенький медиаплеер и все меня в нем устравает, но вот людь который пользуется моим плеером делает так:
выделяет несколько файлов допустим mp3 и правой кнопкой открывает но запускается сразу несколько плееров . В реестре прописано так:
mp3 по умолчанию (мyplayer)

myplayer
 shell
    open (по умолчанию = воспроизвести)
      command (поумолчанию "C:\Program files\myplayer\player.exe" "%L")

вот я и подумал что при повторном открытии передать paramstr(1)
после получения hwnd записываю paramstr(1) в файл на жестком
после чего postmessage(hwnd,my_msg,0,0);

все это прекрасно работает когда тюкаешь по одному файлу, но когда все одновременно получается белеберда

может есть способ другой, подскажите полалуйста

P.S. т.к. я живу на камчатке только что открыл эту ветку


 
Сергей М. ©   (2007-04-24 09:55) [10]


> т.к. я живу на камчатке только что открыл эту ветку


Однако, прелюбопытная причинно-следственная свящь)


 
StriderMan ©   (2007-04-24 10:04) [11]

по сокету через localhost. (TServerSocket, TClientSocket)


 
Сергей М. ©   (2007-04-24 10:06) [12]


> StriderMan ©   (24.04.07 10:04) [11]


> по сокету


Не жирно ли будет - из пушки да по воробьям ?)


 
StriderMan ©   (2007-04-24 10:14) [13]


> Сергей М. ©   (24.04.07 10:06) [12]
> Не жирно ли будет - из пушки да по воробьям ?)

делов на 5 минут, зато заклад на будущую распределенность ;)

а вообще в шутку конечно.


 
Hero ©   (2007-04-24 10:45) [14]

Сергей М. ©   (24.04.07 09:55) [10]

> т.к. я живу на камчатке только что открыл эту ветку

Однако, прелюбопытная причинно-следственная свящь)

А если по делу?
не ужель и впрям из пушки придется по воробьям?
пробовал реестр копать по поводу того как енто делает WMP никаких существенных результатов мне это не дало.

может подскажете а? Ну.... если знаете конечно ;)


 
Сергей М. ©   (2007-04-24 11:05) [15]


> Hero ©   (24.04.07 10:45) [14]


> не ужель и впрям из пушки придется по воробьям?


Зачем ? Из пушки, конечно же, не надо , тем более по воробьям)

Решение тебе подсказано в [3], а вот как идентифицировать окно-адресат - это уже иной вопрос.


 
sniknik ©   (2007-04-24 12:22) [16]

> а вот как идентифицировать окно-адресат - это уже иной вопрос.

> нахожу handle вот таким способом
FindWindow видимо слишком прост для тебя... не дает как следует "попариться", прочуствовать суть программирования... ;)


 
Hero ©   (2007-04-24 13:43) [17]

ну в самом то деле читайте вниметельней [9]
это я уже пробовал работает
но не так как мне нада
дело в том что при открывании нескольких файлов mp3 как это делает юзер выделяет в папке с музыкой файлы и правой кнопкой открывает при таком коде как вы мне подсказали это работает медленно и вообще не понять чо получается причем первой запущенной в плейлист не все "выделенное" попадает.
вот я и спрашиваю есть ли иной способ кроме как : искать хэндл и посылать message этому хэндлу и потом халт
ну потрудитесь сами написать то что мне предлагаете и увидите что ничего хорошего из этого не получится


 
sniknik ©   (2007-04-24 14:11) [18]

> это я уже пробовал работает
> но не так как мне нада
а вот как тебе нада система не спрашивает, подстраиваться нужно тебе под то что есть...

> ну потрудитесь сами написать то что мне предлагаете и увидите что ничего хорошего из этого не получится
потрудился, все очень даже хорошо получается... есть всего лиш два варианта... (всего 2 !!! счастье то какое, халява), в первом приходит строка с перечисленными файлами для открытия (если выделить блок файлов и перетащить на ярлык программы) во втором все отмеченные выдаются программе по одному разным копиям (выделить блок и по правой кнопке выбрать "выполнить с помощью").
что в первом случае - разбор строки, что во втором - последовательное по штучное добавление в плейлист (ну и что что посылают разные копии?), не вижу никаких проблем в реализации.


 
Сергей М. ©   (2007-04-24 14:13) [19]


> выделяет в папке с музыкой файлы и правой кнопкой открывает


..  и при этом вне зависимости от кол-ва выбранных файлов открывает юзер только тот файл, на который смотрел курсор мыши в момент выполнения меню "Открыть".

Задумайся над этим)


 
sniknik ©   (2007-04-24 14:16) [20]

даже проще, первый вариант с несколькими параметрами можно свести ко второму, просто в посылающей копии посылать не paramstr(1) а все по paramscount.
принимающая же тогда (первая запущенная), просто ловит названия по одному, и добавляет в плейлист.


 
Hero ©   (2007-04-24 14:41) [21]


sniknik ©   (24.04.07 14:16) [20]

даже проще, первый вариант с несколькими параметрами можно свести ко второму, просто в посылающей копии посылать не paramstr(1) а все по paramscount.

дык paramcount = 1 как никрути (0 в случае если просто запускаешь exe`шник)

Сергей М. ©   (24.04.07 14:13) [19]

...Задумайся над этим)


иииии.........! а по ширша подсказачку.......никак?


 
Сергей М. ©   (2007-04-24 14:59) [22]


> а по ширша подсказачку.......никак?


Ну отчего ж ?)

Еще "как")

Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.


 
sniknik ©   (2007-04-24 15:03) [23]

> дык paramcount = 1 как никрути
в одном из вариантов да... а ты то сам трудишься проверять то что тебе говорят?

> 0 в случае если просто запускаешь exe`шник
нет не просто, имхо, но если копия вторая то при "пустом" запуске нужно "поднять" первую на передний план, и также завершисся как и с параметрами.

второго запуска в принципе не должно быть (вернее не доводить до создания формы), т.к. раз у тебя есть передача в первую копию то вторая запущенная добавит неоднозначности, куда будет посылать файлы третья копия с параметрами?...


 
Hero ©   (2007-04-24 15:03) [24]


Сергей М. ©   (24.04.07 14:59) [22]

> а по ширша подсказачку.......никак?

Ну отчего ж ?)
Еще "как")
Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.


тобишь искать в той папке в которой юзерь выделил файлы выделенные файлы так?


 
sniknik ©   (2007-04-24 15:06) [25]

> Смотреть интерфейсы IShellExtInit, IContextMenu и букварь Эрика Хармона по COM-программированию в среде Делфи.
это... чето вы мудрите батенька,  простейшую в общем то вещь так запутали... (сам не понял к чему тут COM/интерфейсы присобачивать...)

... ммм. ладно, счас пример оформлю.


 
Сергей М. ©   (2007-04-24 15:08) [26]


> sniknik ©   (24.04.07 15:06) [25]


Ну а какой же идиот будет передавать список в параметрах ком.строки ?)


 
sniknik ©   (2007-04-24 15:36) [27]

> Ну а какой же идиот будет передавать список в параметрах ком.строки ?)
... мммммм. ты?
ты же это советуешь, или это как типа диверсии направить на путь которым сам не пользуешься?

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

program Project1;

uses
 Forms,
 Windows,
 Messages,
 Unit1 in "Unit1.pas" {GetDataForm};

{$R *.res}

var
 Hndl: THandle;
 i: integer;

function SendMessData(TrgWnd, SrcWnd: THandle; Dt: integer; const St: string): integer;
var
 CDate: TCopyDataStruct;
begin
 with CDate do begin
   cbData:= Length(St) + 1;
   if cbData = 1
     then Result:= 0
     else begin
       dwData:= Dt;
       lpData:= @St[1];
       Result:= SendMessage(TrgWnd, WM_COPYDATA, SrcWnd, integer(@CDate));
     end;
 end;
end;

begin
 Hndl:= FindWindow("TGetDataForm", nil);
 if Hndl > 0 then begin             //есть окно, мы вторые (проверка первого запуска по окну медленная! только для примера, в реале лучше это делать после проверки по семафору)
   if ParamCount = 0
     then SetForegroundWindow(Hndl) //"подымаем" первую копию
     else
       for i:= 1 to ParamCount do   //передаем пофайлово
         SendMessData(Hndl, 0, i, ParamStr(i));
   Exit;                            //этой копии больше делать нечего
 end;

 Application.Initialize;
 Application.CreateForm(TGetDataForm, GetDataForm);
 Application.Run;
end.

unit Unit1;

interface

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

type
 TGetDataForm = class(TForm)
   ListBox1: TListBox;
   procedure FormCreate(Sender: TObject);
 private
   procedure doGetDate(var Message: TMessage); message WM_COPYDATA;
 end;

var
 GetDataForm: TGetDataForm;

implementation

{$R *.dfm}

procedure TGetDataForm.doGetDate(var Message: TMessage);
begin
 ListBox1.Items.Add(PChar(PCopyDataStruct(Message.LParam).lpData)); //ловим, считаем что в любом случае посылка = 1 файлу (т.е. без разбора строк)
end;

procedure TGetDataForm.FormCreate(Sender: TObject);
var i: integer;
begin
 for i:= 1 to ParamCount do //первую копию тоже могут с параметрами запустить...
   ListBox1.Items.Add(ParamStr(i));
end;

end.


p.s. ну разве сложно?


 
Сергей М. ©   (2007-04-24 15:49) [28]


> ты же это советуешь


Я советую ?!

Да ты что ! Да бог с тобой).. Где ты это увидел ?)

Это как раз автор использует "посредником" ком.строку, а не я ему это предлагаю)


 
sniknik ©   (2007-04-24 16:15) [29]

> Это как раз автор использует "посредником" ком.строку, а не я ему это предлагаю)
ком.строку это командная строка(?) часть которой параметр, а не COM, автор не может ее не использовать т.к. система так передает при обсуждаемых вариантах, с выбором нескольких файлом и "открыть как".

а я в [25] про итерфейсы и COM..., не можно и COM обьектом прогу оформить и передачу на интерфейсах сделать но это както черезчур. и следом в [27] воспринял как продолжение про COM и интерфейсы. а про них ты советуешь.


 
Сергей М. ©   (2007-04-24 16:23) [30]


> sniknik ©   (24.04.07 16:15) [29]


> "открыть как".


Про "как" у автора речи не идет.
У него просто про "Открыть" идет речь.
Впрочем, то не столь важно.


> не можно и COM обьектом прогу оформить


"Не можно" <> "не нужно"

))


 
Hero ©   (2007-04-25 04:34) [31]

sniknik ©   (24.04.07 15:36) [27]
Ой чавойто я не пойму, вы уж простите мое делитанство  так скать.
почамуто при одновременном открывании 4-х файлов mp3  (мы опускаем отлавливание окон ) открывается 4 моей программы (плеера) с всего лишь с 2 парааметрами  paramstr(0) = application.exename и paramstr(1) = путь\имя файла одного из выделенных файлов.
Извиние , а как  же так мне умудрится господин sniknik © , чтобы открывалася одна моя программа , где paramcount (в данном случае) равнялась 4-м

Сергей М. ©   (24.04.07 14:59) [22]
Да спасибо, буду читать


 
sniknik ©   (2007-04-25 09:13) [32]

чтобы система записала в параметры 4 файла нужно буквально выполнить действия одного из описанных в [18] варианта... т.е. выделить блок из 4х файлов "схватить" этот блок мышкой и перетянуть на лежащий рядом (для простоты) exe файл программы. система запустит эту программу с 4мя параметрами.
делать это надо в проводнике (за всякие "фары" и "тотал командеры" не скажу).

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

почему твоя программа, открывается (судя по всему для другого варианта описанного в [18]) 2 раза с одним параметром и 2 раза без них (хотя должно 4 раза с 1-м), это тебе лучше знать (мой пример лишен этого недостатка, легко проверить), я же полагаю что это последствия 17й строки при работе с файлом для передачи этих параметров. ты попросту чтото перетираеш изза медленности файлов. которые гораздо медленнее, на порядки, чем тот же поиск окна о котором предупреждал... и если с поиском ты только возможно получишь глюк, умудришся получить 2 одновременно работающие копии то с файлами гарантировано (надо специально чтото делать чтобы синхронизировать, задержки например ставить).

> чтобы открывалася одна моя программа , где paramcount (в данном случае) равнялась 4-м
или ты хочеш чтобы оно запускалось так даже для случая когда система запускает 4 экземпляра проги? ну это тогда к Биллу, я же уже говорил кому надо подстраиваться по то что есть...

> Сергей М. ©   (24.04.07 14:59) [22]
> Да спасибо, буду читать
вообщето, то что он там советует это совсем из другой "оперы", почитать конечно полезно (любые знания не повредят), но для твоей задачи решение через COM /интерфейсы можно рассматривать только в качестве казуса (как вырезание гланд через заднепроходное отверстие)
и к тому же они не изменят способов запуска проги системой, будут теже 2 варианта, оно только позволит тебе сделать передачу по другому и все. (если вообще справишься, после непонимания готового, простого кода, я в этом сомневаюсь)


 
Hero ©   (2007-04-25 10:18) [33]

sniknik ©   (25.04.07 09:13) [32]

Да вот всетаки решил скомпилить твой код и действительно все работает так как надо

извините что заморочил голову всем :)



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

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

Наверх




Память: 0.57 MB
Время: 0.048 c
2-1177246379
junior_177
2007-04-22 16:52
2007.05.13
Формула Магического квадрата


3-1171907342
malyar
2007-02-19 20:49
2007.05.13
MYSQL запрос с условием


15-1176406429
ArtemESC
2007-04-12 23:33
2007.05.13
Быть программером или около того...


2-1177098573
lubopitniy
2007-04-20 23:49
2007.05.13
поиск в строке


2-1177321714
Сорокин М
2007-04-23 13:48
2007.05.13
valuelisteditor