Как получить uin открытого окна чата из плагина?

Больше
12 года 10 мес. назад #1 от Sleuthhound
Собственно как получить uin из окна чата понятно, это

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 :(

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 10 мес. назад - 12 года 10 мес. назад #2 от Rapid D
Sleuthhound писал(а):

Собственно как получить uin из окна чата понятно, это
...

Желательно такое сочетание:
типа:
      PE_MSG_SENT:
        begin
          ShowMessage(IntToStr(RQ_GetChatUIN()));
        end;

      PE_MSG_GOT:
        begin
          ShowMessage(IntToStr(RQ_GetChatUIN()));
        end;
не использовать. Т.к. сообщение отправляется не обязательно того чата, которое открыто. Может вообще быть так, что все чаты закрыты.
PE_SELECTTAB срабатывает, когда активен таб от плагина - там и нету никакого UIN-а. Зачем вам это событие?
Последнее редактирование: 12 года 10 мес. назад пользователем Rapid D.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 10 мес. назад #3 от Sleuthhound
Задача проста, по нажатию кнопки плагина на панели активной вкладки чата выудить uin собеседника.

Такое работает с помощью RQ_GetChatUIN(), но только в момент отправки или принятия сообщения ну или др. событий в активной вкладке.

Для примера, плагин InvisChecker как-то же узнает uin собеседника из активной вкладки, вот и интересует как такое можно сделать.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 10 мес. назад #4 от Rapid D
из ваших примеров, ни грамма про обработку нажатия кнопки плагина.
всё там работает

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 10 мес. назад #5 от Sleuthhound
Rapid D писал(а):

из ваших примеров, ни грамма про обработку нажатия кнопки плагина.
всё там работает


Согласен, я мало написал что бы что-то понять, исправляюсь:

Вот что есть:
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 плагинов тоже :(

Нужно чтобы

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 10 мес. назад - 12 года 10 мес. назад #6 от Rapid D
Sleuthhound писал(а):

...
При нажатии кнопки плагина на панели обрабатывается событие PE_SELECTTAB и открывается вкладка плагина, тут все понятно. Надеюсь я ничего не попутал в терминах.
...

Собсно, вы всё напутали.
Обработчик нажатия на кнопку - это та процедура, что указывается в PC_ADDBUTTON

Пример работы с кнопкой можете посмотреть например в плагине RnQmessage
Последнее редактирование: 12 года 10 мес. назад пользователем Rapid D.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 10 мес. назад - 12 года 10 мес. назад #7 от Mikanoshi
RQ_GetChatUIN() в любой момент возвращает уин контакта, с которым в данный момент открыт чат, а PE_SELECTTAB - событие выбора любой вкладки, хоть формы плагина, хоть окна чата (для этого там и есть сравнение хэндла).

В процедуру нажатия кнопки передаётся параметром типа integer какая клавиша нажата: 0 - левая, 1 - правая, 2 - средняя.
Последнее редактирование: 12 года 10 мес. назад пользователем Mikanoshi.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 10 мес. назад #8 от Sleuthhound
Rapid D писал(а):

Собсно, вы всё напутали.
Обработчик нажатия на кнопку - это та процедура, что указывается в PC_ADDBUTTON

Пример работы с кнопкой можете посмотреть например в плагине RnQmessage


Теперь все понятно, спасибо за разьяснения. Все получилось :)

Mikanoshi писал(а):

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

В процедуру нажатия кнопки передаётся параметром типа integer какая клавиша нажата: 0 - левая, 1 - правая, 2 - средняя.


Все понятно, огромное спасибо Mikanoshi :) Эх если бы все это было хоть вкраце в SDK написано, то и вопросов бы не возникло.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад - 12 года 9 мес. назад #9 от rrrFer_

RQ_GetChatUIN

поясните откуда эта функция? - в RnQ_miniSDK4 про нее не упоминается...
я когда-то писал свою на С++:
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
}
[offtop]извиняюсь за некропостинг[/offtop]
[PS]форматирование кода испортилось при вставке на форум (. Как указать язык при вставке тоже не нашел.[/PS]
Последнее редактирование: 12 года 9 мес. назад пользователем rrrFer_.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад - 12 года 9 мес. назад #10 от Mikanoshi
rrrFer_ писал(а):

RQ_GetChatUIN

поясните откуда эта функция?

Есть такой файлик CallExec.pas, там много подобных вспомогательных функций. Просто обёртки для вызова callback.

Вложение CallExec.zip не найдено

Вложения:
Последнее редактирование: 12 года 9 мес. назад пользователем Mikanoshi.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад #11 от rrrFer_
спасибо :)
МБ этот файл в архив SDK стоит добавить?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад #12 от Rapid D
rrrFer_ писал(а):

спасибо :)
МБ этот файл в архив SDK стоит добавить?

Этот файл есть в большинстве плагинов.
Код в этом файле мне лично не очень нравится

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад #13 от rrrFer_

Этот файл есть в большинстве плагинов.
Код в этом файле мне лично не очень нравится

Наверно в большинстве плагинов, написанных на delphi. Я нашел всего 2 плагина с открытым кодом на С++: AckMaster060 и AwayByLock_v08. МБ новые появились, я искал примерно год назад.
Ни в одном из этих плагинов не видел подобного файла - только rqplug.h и rqplugutils.h

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад #14 от Rapid D
На Си тут мало кто пишет :)
Если переведёте его в Си - можно будет и включить в архив...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад #15 от rrrFer_
МБ переведу :)
как раз в блоге описываю как писать плагины для R&Q по чуть-чуть :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад #16 от Rapid D
Только сразу учитывайте, что лучше копировать ответ от Callback-а как можно быстрее.
Т.к. в этом ответе лишь ссылка на буфер, который живёт пока не будет ответа другому плагину.
Если плагины многопоточны - может случиться всё что угодно :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад #17 от rrrFer_
спасибо за совет ))

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
12 года 9 мес. назад #18 от rrrFer_

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Модераторы: bassvazoozaDelphukdekRapid D
Время создания страницы: 0.459 секунд
Работает на Kunena форум