IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Плеер, Одна проблемка.
сообщение
Сообщение #1


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Вожусь с плеером.Ктонибудь не подскажет одну вещь: допустим я использую свой плеер по умолчанию (
  if not ('' = System.ParamStr(1)) then
with MediaPlayer1 do
begin
try
Filename := System.ParamStr(1);
{Ну и так далее...}
) Так вот когда я не закрывая первого экземпляра плеера открываю другой муз. файл, то открывается второй экземпляр плеера и там играет вторая мелодия. А я хочу чтобы 2-я мелодия играла в первом экземпляре.

Сообщение отредактировано: Артемий2 -


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Алгоритм такой:
1) Проверяешь при старте программы (onCreateForm) не запущен ли еще один экземпляр твоего плеера. Как сделать смотри Получение списка запущенных приложений
2) Если экземпляр есть, то шли сообщение ему (PostMessage), в котором указано имя нового файла для воспроизведения и завершай работу программы (только не первого экземпляра ;) ).
3) Организуй обработку своего события (т.н. сообщения - например const WM_ADD_IN_PLAYLIST = WM_USER + 1010; ) как это сделать - пример из стандартного хелпа:
//The following code handles a custom message that the application sends to itself when a file is ready for reading.

const
WM_FILEREADY = WM_USER + 2000;
procedure TForm1.FormCreate(Sender: TObject);

begin
Application.OnMessage := AppMessage;
end;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_FILEREADY then
begin
Memo1.Lines.LoadFromFile(StrPas(PChar(Msg.lParam)));
Handled := True;

end;

{ for all other messages, Handled remains False }
{ so that other message handlers can respond }
end;

Удачи smile.gif

Сообщение отредактировано: hiv -


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Примерно что-то вроде этого думал, но не знал как сделать. Спасибо. good.gif

Сообщение отредактировано: Артемий2 -


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Цитата
2) Если экземпляр есть, то шли сообщение ему (PostMessage), в котором указано имя нового файла для воспроизведения и завершай работу программы (только не первого экземпляра ;) ).

Извиняюсь за тормоз! А как именно приложению отправить это имя? В смысле в PostMessage не разбираюсь.. mega_chok.gif (отписался и забыл про эту тему,теперь вспомнил)


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Цитата(Артемий @ 22.08.2007 17:26) *
В смысле в PostMessage не разбираюсь..
Вот так посылать сообщения:
PostMessage(hWnd, WM_FILEREADY, 0, MusicFileName);
Close;
где hWnd - хендлер уже запущенного твоего плеера (как его найти я давал ссылку вверху).
Close - означает выход из текущего плеера...

Сообщение отредактировано: hiv -


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Как я понимаю на этапе использования PostMessage, ты уже уверен что твое приложение запущенно. А значит можешь идентифицировать его, например, по названию оконного заголовка или класса окна. Для этого в WinApi есть функция FindWindow. Первый параметр - название класса окна, второй - название заголовка окна. Есть возможность искать только по одному из параметров (в случае когда второй неизвестен), подставляя под значение другого nil, но гарантия нахождения именно твоего окна увеличивается при задании сразу двух параметров. Результат этой функции, в случае успешного выполнения, вернет handle твоего окна (того, что стартовало первым). Именно за этим мы использовали FindWindow, ибо первый аргумент функции PostMessage и есть handle окна, которому ты хочешь отправить сообщение. В качестве Msg можешь указать WM_ADD_IN_PLAYLIST (из поста hiv'a), а полезную нагрузку будут выполнять два оставшихся параметра. Вернее в нашем случае понадобиться только один. Тип каждого из них это DWord, который занимает 4 байта. Как раз как и pointer или pChar... Т.е. ты просто приводишь свою строку к DWord и передаешь получившиеся как аргумент в функцию.


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Цитата
Т.е. ты просто приводишь свою строку к DWord

А как привести строку к dword?

Сообщение отредактировано: Артемий -


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


dword(PChar). Хотя правильнее будет WPARAM(PChar) или LPARAM (PChar), в соответствии с типом аргумента в котором ты захочешь передавать данные.

Сообщение отредактировано: Bokul -


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Пасибо ребят! (если будут вопросы - отпишусь smile.gif ) а пока - +1 Bokul и +1 hiv! Вы реально помогли! good.gif


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
1) Проверяешь при старте программы (onCreateForm) не запущен ли еще один экземпляр твоего плеера. Как сделать смотри Получение списка запущенных приложений

Гораздо надежнее было бы использовать CreateMutex с заранее сгенерированным GUID-ом в качестве третьего параметра для отлова второй копии приложения...

P.S. С цитатой сначала промахнулся... Исправил...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


Цитата
P.S. С цитатой сначала промахнулся... Исправил...

А если вернуться к первоначальной, как повысить надежность нахождения нужного окна? На ум приходит только явное сохранение handle в заданном месте, например в файле или атоме..


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Ага, сейчас прямо... Все дела забросим и будем файлы плодить smile.gif

mailslots никто не отменял: Ассоциированные файлы и предотвращение запуска второй копии приложения
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Блин, при компиляции программы FindWindow сразу находит первый экземпляр..Что не так?
procedure TForm1.FormCreate(Sender: TObject);
var
d: PChar;
h: hwnd;
begin
Application.OnMessage := AppMessage;
d := PChar(System.ParamStr(1));
h := FindWindow(nil,'MP3 1.8.0.7');
if h<>0 then begin
PostMessage(h,WM_ADD_TO_PLAYLIST,0,lparam(d));
Application.Terminate;
end;
end;


Сообщение отредактировано: Артемий -


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Ну, во-первых, ты где прописал Caption формы? В Object Inspector-е? Надо бы здесь:

begin
Application.OnMessage := AppMessage;
d := PChar(System.ParamStr(1));
h := FindWindow(nil,'MP3 1.8.0.7'); // <--- Здесь ищешь именно первое приложение
if h<>0 then begin
PostMessage(h,WM_ADD_TO_PLAYLIST,0,lparam(d));
Application.Terminate;
end;

// Вот тут, уже после FindWindow, можно менять Caption формы...
Form1.Caption := 'MP3 1.8.0.7';
...


Должно работать... А если у тебя Caption прописан в Инспекторе, то получишь то, что получаешь smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Ага,я понял.Спасибо за помощь!


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Это опять я. !low.gif !low.gif Сообщение от второго экзэмпляра первому передается,только первое нифига нормально обработать не может:
procedure TForm1.FormCreate(Sender: TObject);
var
d: PChar;
h: hwnd;
begin
Application.OnMessage := AppMessage;
d := PChar(System.ParamStr(1));
h := FindWindow(nil,'MP3 1.8.0.7');
if (h<>0) then begin
PostMessage(h,WM_ADD_TO_PLAYLIST,0,lparam(d));
Application.Terminate;
end;
end;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_ADD_TO_PLAYLIST then
begin
MediaPlayer1.FileName := StrPas(PChar(Msg.lParam)); {<-------- Вот тут произходит ошибка!!!!!}
MediaPlayer1.Open;


Сообщение отредактировано: Артемий -


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
var s: string;
begin
if Msg.message = WM_ADD_TO_PLAYLIST then
begin
s := StrPas(PChar(Msg.lParam));
MediaPlayer1.FileName := s; // Вот так ошибка не произойдет, если передано правильное имя файла
MediaPlayer1.Open;
...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


Теперь ошибка происходит в этой строке:
s := StrPas(PChar(Msg.lParam));


Добавлено через 2 мин.
Дело еще в том,что значение lParam(d) в процедуре FormCreate одно, а в процедуре AppMessage Msg.lParam значение другое..я сравнил...


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






blink.gif У меня не происходит... Покажи, как ты передаешь имя файла, может там проблема...

Добавлено через 4 мин.
А, у тебя берется параметр командной строки... Я сделал вот так:


var
d: PChar; // Глобально !!!

procedure TForm1.FormCreate(Sender: TObject);
var h: hwnd;
begin
Application.OnMessage := AppMessage;
d := PChar(ExtractFilePath(ParamStr(0)) + 'sound.wav');
h := FindWindow(nil,'MP3 1.8.0.7');
if h<>0 then begin
PostMessage(h,WM_ADD_TO_PLAYLIST,0,lparam(d));
Application.Terminate;
end;
Form1.Caption := 'MP3 1.8.0.7';
...
end;

const
WM_ADD_TO_PLAYLIST = WM_USER + 1010;

procedure TForm1.AppMessage(var Msg: TMsg; var Handled: Boolean);
var s: string;
begin
if Msg.message = WM_ADD_TO_PLAYLIST then
begin

s := StrPas(PChar(Msg.lParam));
MediaPlayer1.FileName := S;
MediaPlayer1.Open;
Handled := True;

end;
end;

- все отработало...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Помощник капитана
****

Группа: Пользователи
Сообщений: 601
Пол: Мужской
Реальное имя: Артем

Репутация: -  2  +


В смысле как передаю? System.ParamStr(1)?

Добавлено через 8 мин.
Все равно пишет ошибку! (сволочь (извините))


--------------------
Dum spiro spero!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.12.2024 1:43
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name