Как получить uin открытого окна чата из плагина?
- Sleuthhound
- Не в сети
- Premium Member
- Сообщений: 84
- Спасибо получено: 0
function RQ_GetChatUIN:integer;
var
data:Pointer;
begin
data:=CallStr(AnsiChar(PM_GET)+AnsiChar(PG_CHAT_UIN));
Result:=_int_at(data, 5);
end;
Но всё это будет работать к примеру при отправке сообщения или его приему
типа:
PE_MSG_SENT:
begin
ShowMessage(IntToStr(RQ_GetChatUIN()));
end;
PE_MSG_GOT:
begin
ShowMessage(IntToStr(RQ_GetChatUIN()));
end;
А как сделать чтобы это работало когда я нажимаю на кнопку плагина в панели чата и вызывается событие:
PE_SELECTTAB:
????
Если я вызываю RQ_GetChatUIN() при нажатии кнопки плагина, то есть при вызове PE_SELECTTAB, то результат = 0
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Желательно такое сочетание:Собственно как получить uin из окна чата понятно, это
...
типа:
PE_MSG_SENT:
begin
ShowMessage(IntToStr(RQ_GetChatUIN()));
end;
PE_MSG_GOT:
begin
ShowMessage(IntToStr(RQ_GetChatUIN()));
end;
PE_SELECTTAB срабатывает, когда активен таб от плагина - там и нету никакого UIN-а. Зачем вам это событие?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Sleuthhound
- Не в сети
- Premium Member
- Сообщений: 84
- Спасибо получено: 0
Такое работает с помощью RQ_GetChatUIN(), но только в момент отправки или принятия сообщения ну или др. событий в активной вкладке.
Для примера, плагин InvisChecker как-то же узнает uin собеседника из активной вкладки, вот и интересует как такое можно сделать.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
всё там работает
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Sleuthhound
- Не в сети
- Premium Member
- Сообщений: 84
- Спасибо получено: 0
из ваших примеров, ни грамма про обработку нажатия кнопки плагина.
всё там работает
Согласен, я мало написал что бы что-то понять, исправляюсь:
Вот что есть:
function pluginFun(data:pointer):pointer; stdcall;
var
handle: Integer;
r: TRect;
begin
result:=NIL;
if (data=NIL) or (_int_at(data)=0) then exit;
case _byte_at(data,4) of
PM_EVENT:
case _byte_at(data,5) of
PE_INITIALIZE:
begin
RQ__ParseInitString(data, callback, vapiVersion, andrqPath, userPath, CurrentUIN);
if RQ_GetRnQVersion < 1074 then
begin
MessageBox(0, PChar('Извините, но RnQ Test Plugin не может работать с данной версией RnQ.'+ #13'Пожалуйста, обновите программу и снимите галку с плагина RnQHistoryToDB.dll '), PChar(PluginName), MB_ICONHAND);
Exit;
end;
if not assigned(ExmplFrm) then
ExmplFrm := TExmplFrm.create(NIL);
if not assigned(SettingsForm) then
SettingsForm := TSettingsForm.create(NIL);
ShowWindow(application.Handle, SW_HIDE);
SetLength(PicIndexMass,0);
SetLength(PicIndexMass, Length(PicIndexMass) + 1);
LoadINI;
data := callStr(ansichar(PM_GET) + ansichar(PG_WINDOW) + ansichar(PW_CHAT));
chat_hwnd := _int_at(data, 5);
if chat_hwnd <> 0 then
ExmplFrm.ParentWindow:= chat_hwnd;
panelID:= 0;
ba:= RQ_CreateChatButton(@OnButtonClick, ExmplFrm.Icon.Handle, PluginName);
result:=str2comm(ansichar(PM_DATA)+_istring(PluginName)+_int(APIversion));
end;
PE_PREFERENCES:
begin
SettingsForm.Show;
end;
PE_FINALIZE:
begin
if MyTimerEnabled then StopMyTimer;
if ba <> 0 then RQ_DeleteChatButton(ba);
if panelID <> 0 then callStr(ansichar(PM_CMD)+ansichar(PC_TAB_DELETE)+_int(Integer(ExmplFrm.Handle)));
if ExmplFrm <> nil then ExmplFrm.Free;
if SettingsForm <> nil then SettingsForm.Free;
end;
PE_SELECTTAB:
begin
handle := _int_at(data, 6);
r := RQ_GET_CHAT_RECT;
if ExmplFrm.Handle = handle then
begin
ExmplFrm.BoundsRect := r;
ExmplFrm.Show;
SetWindowPos(ExmplFrm.Handle, hwnd_TopMost,
ExmplFrm.Top, ExmplFrm.left,
ExmplFrm.Width, ExmplFrm.Height, swp_NoMove or swp_NoSize or swp_NoRedraw);
end;
selectedtb := true;
opentb := true;
if MyTimerEnabled then
begin
StopMyTimer;
ExmplFrm.LoadICONDefault;
end;
end;
PE_DESELECTTAB:
begin
handle:= _int_at(data, 6);
if ExmplFrm.Handle = handle then
begin
ExmplFrm.Hide;
end;
selectedtb := false;
end;
PE_CLOSETAB:
begin
handle:= _int_at(data, 6);
if ExmplFrm.Handle = handle then
begin
SaveBoolToINI;
ExmplFrm.Close;
panelID:= 0;
end;
selectedtb := false;
opentb := false;
end;
PE_MSG_SENT:
begin
AddMsgToFile(data, 0);
end;
PE_MSG_GOT:
begin
AddMsgToFile(data, 1);
end;
end; //case
end; //case
end; //pluginFun
exports
pluginFun;
Пример честно взять их плагина RnQEye и несколько изменен под мои нужды.
При нажатии кнопки плагина на панели обрабатывается событие PE_SELECTTAB и открывается вкладка плагина, тут все понятно. Надеюсь я ничего не попутал в терминах.
Дак вот, а как сделать чтобы при нажатии этой же кнопки можно было узнать uin открытого окна чата с пользователем в котором произошло нажатие кнопки плагина?
И еще не могу понять как обработать нажатие правой кнопки мышки на кнопки плагина.
Возможно вопросы чайниковские, но примеров увы нет, описания API плагинов тоже
Нужно чтобы
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Собсно, вы всё напутали....
При нажатии кнопки плагина на панели обрабатывается событие PE_SELECTTAB и открывается вкладка плагина, тут все понятно. Надеюсь я ничего не попутал в терминах.
...
Обработчик нажатия на кнопку - это та процедура, что указывается в PC_ADDBUTTON
Пример работы с кнопкой можете посмотреть например в плагине RnQmessage
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Mikanoshi
- Не в сети
- Platinum Member
- Сообщений: 1112
- Спасибо получено: 158
В процедуру нажатия кнопки передаётся параметром типа integer какая клавиша нажата: 0 - левая, 1 - правая, 2 - средняя.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Sleuthhound
- Не в сети
- Premium Member
- Сообщений: 84
- Спасибо получено: 0
Собсно, вы всё напутали.
Обработчик нажатия на кнопку - это та процедура, что указывается в PC_ADDBUTTON
Пример работы с кнопкой можете посмотреть например в плагине RnQmessage
Теперь все понятно, спасибо за разьяснения. Все получилось
Mikanoshi писал(а):
RQ_GetChatUIN() в любой момент возвращает уин контакта, с которым в данный момент открыт чат, а PE_SELECTTAB - событие выбора любой вкладки, хоть формы плагина, хоть окна чата (для этого там и есть сравнение хэндла).
В процедуру нажатия кнопки передаётся параметром типа integer какая клавиша нажата: 0 - левая, 1 - правая, 2 - средняя.
Все понятно, огромное спасибо Mikanoshi Эх если бы все это было хоть вкраце в SDK написано, то и вопросов бы не возникло.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- rrrFer_
- Не в сети
- Junior Member
- Сообщений: 38
- Спасибо получено: 0
поясните откуда эта функция? - в RnQ_miniSDK4 про нее не упоминается...RQ_GetChatUIN
я когда-то писал свою на С++:
INT RnQ_GetUINCurrentChatTab(){
DWORD iAPos,iPos,
*pCommunication;
BYTE *bComm;
INT iDestUIN, //возвращаемое значени
iLen;
iDestUIN=0;
iAPos = 4;
bAnswer[iAPos] = PM_GET; iAPos++;
bAnswer[iAPos] = PG_CHAT_UIN; iAPos++;
iAPos -=4;
memcpy(bAnswer,&iAPos,4);
pCommunication = funcCallback((DWORD*)bAnswer);
do{
if (pCommunication==NULL) break;
//Get and check len
memcpy(&iLen,pCommunication,4);
if (iLen<18){
MessageBoxA(NULL,"ERR: RnQ_GetUINCurrentChatTab","",MB_OK);
break;
}
//------------------------
//0-3 INT длина запроса
//4 BYTE байт, почему-то всегда равен двум
//5-8 INT UIN
//9-12 INT длина строки
//12-...строка, содержащая UIN
//-------------------------
//9-... это ISTRING, но че-то криво считывает функцией RQ_GetISTRING
//считывает только 6 первых символов, но и iLen возвращает 18, но Тогда от UIN
//должно входить только 6 символов.
//считать строку с UIN целиком можно так:
//RQ_GetINT(bComm,&iPos,iLen,&ilenS);
//strncpy(s,(char*)(bComm+iPos),ilenS);
//в конце терминатор
iPos=5;
bComm = (BYTE*)(pCommunication);
RQ_GetINT(bComm,&iPos,iLen,&iDestUIN);
} while(0);
return iDestUIN; //no errors
}
[PS]форматирование кода испортилось при вставке на форум (. Как указать язык при вставке тоже не нашел.[/PS]
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Mikanoshi
- Не в сети
- Platinum Member
- Сообщений: 1112
- Спасибо получено: 158
Есть такой файлик CallExec.pas, там много подобных вспомогательных функций. Просто обёртки для вызова callback.
поясните откуда эта функция?RQ_GetChatUIN
Вложение CallExec.zip не найдено
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- rrrFer_
- Не в сети
- Junior Member
- Сообщений: 38
- Спасибо получено: 0
МБ этот файл в архив SDK стоит добавить?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Этот файл есть в большинстве плагинов.спасибо
МБ этот файл в архив SDK стоит добавить?
Код в этом файле мне лично не очень нравится
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- rrrFer_
- Не в сети
- Junior Member
- Сообщений: 38
- Спасибо получено: 0
Наверно в большинстве плагинов, написанных на delphi. Я нашел всего 2 плагина с открытым кодом на С++: AckMaster060 и AwayByLock_v08. МБ новые появились, я искал примерно год назад.Этот файл есть в большинстве плагинов.
Код в этом файле мне лично не очень нравится
Ни в одном из этих плагинов не видел подобного файла - только rqplug.h и rqplugutils.h
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Если переведёте его в Си - можно будет и включить в архив...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- rrrFer_
- Не в сети
- Junior Member
- Сообщений: 38
- Спасибо получено: 0
как раз в блоге описываю как писать плагины для R&Q по чуть-чуть
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Т.к. в этом ответе лишь ссылка на буфер, который живёт пока не будет ответа другому плагину.
Если плагины многопоточны - может случиться всё что угодно
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- rrrFer_
- Не в сети
- Junior Member
- Сообщений: 38
- Спасибо получено: 0
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- rrrFer_
- Не в сети
- Junior Member
- Сообщений: 38
- Спасибо получено: 0
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.