Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
ВнизХелп!! Как из одной моей проги перетащить текст в другу мою прог Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.041 c