Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к TrayIcon в Dll->Hook 
V
    Опции темы
Ockonal
Дата 28.8.2007, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



Вообщем нуна помощь. Как мне получить доступ к TrayIcon в хуке(тот в длл).
Тоесть хук клавы. Он находится в длл"ке. Как мне, например, через него сменить иконку.
Тоесть например:
TrayIcon1->SetIconIndex(2);
При "стройке", как и следовало ожидать,ожидать ошибка. TrayIcon1 - не объявлен.
Как же тогда обратится к этому объекту(Если это возможно)
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
586
Дата 28.8.2007, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Нужна синхронизация  твоего приложения с dll'кой. Например, через сообщения, которые будут посылаться в окно твоего приложения функцией SendMessage из dll.
PM   Вверх
jonie
Дата 28.8.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



CALLBACK-ов на вас не хватает ) сдались вам сообщения 8)...
Код

//гдето в хук длл-ке

typedef void (*LPCALLBACKFN) (HICON newIcon);

LPCALLBACKFN changeIcon;

void RegisterHook(HWND parent,LPCALLBACKFN callback) {
 ::changeIcon = callback;
}

void foo(){
...
changeIcon (hNewIconHandle);
..
}

примерно около того...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
586
Дата 28.8.2007, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



jonie, я что-то не помимаю. DLL в другом процессе. какой CALLBACK?
PM   Вверх
jonie
Дата 29.8.2007, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



упс 8) сори, затупил. бывает. smile 


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ockonal
Дата 30.8.2007, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



Вот попробывал с SendMessage:

в хуке dll
//=====================================================================
 char B[KL_NAMELENGTH];  
 AnsiString transl2;        
       //------------------------
        GetKeyboardLayoutName(B);
        transl2 = StrPas(B);
        if(B == "0x409")
        {
         SetIndex = 0;
        };
        if(B == "0x419")
        {
         SetIndex = 1;
        };
        if(B == "0x422")
        {
         SetIndex = 2;
        };
        //------------------------
        SendMessage(hWnd2,WM_INPUTLANGCHANGEREQUEST,SetIndex,0);
        //=====================================================================

в форме:
Создаю ApplicationEvents:
//---------------------------------------------------------------------------

void __fastcall TLangMasterForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
  if(Msg.message==WM_INPUTLANGCHANGEREQUEST)
  {
   switch(Msg.wParam)
   {
    case 0: TrayIcon1->SetIconIndex(0); break; //En
    case 1: TrayIcon1->SetIconIndex(1); break; //Ru
    case 2: TrayIcon1->SetIconIndex(2); break; //Uk
     default: TrayIcon1->SetIconIndex(0); break;//???
   }
 Почему не работает? Один раз меняется значек, и то, когда про активна
  }
}
//---------------------------------------------------------------------------
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
586
Дата 30.8.2007, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(Ockonal @  30.8.2007,  22:30 Найти цитируемый пост)
WM_INPUTLANGCHANGEREQUEST

А это системное сообщение. замени на какой-нибудь WM_USER+1.  А во-вторых наверно надо слать сообщение в Applcation->Handle
PM   Вверх
Ockonal
Дата 31.8.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



Понял, всем, кто ответил СПАСИБО. Тема закрыта
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Ockonal
Дата 31.8.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



Нет...Не закрыта. Сразу кажется получалось... Но ничего. ВОт код:


DLL
 //===================================================================
        //------------------------
        GetKeyboardLayoutName(B);
        transl2 = StrPas(B);
        if(B == "0x409")
        {
         SetIndex = 0;
        };
        if(B == "0x419")
        {
         SetIndex = 1;
        };
        if(B == "0x422")
        {
         SetIndex = 2;
        };
        //------------------------
    SendMessage(Application->Handle,WM_USER+1,SetIndex,0);
        //=================================================================
       

ФОРМА

//---------------------------------------------------------------------------

void __fastcall TLangMasterForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
  if(Msg.message==WM_USER+1)
  {
   switch(Msg.wParam)
   {
    case 0: TrayIcon1->SetIconIndex(0); break;
    case 1: TrayIcon1->SetIconIndex(1); break;
    case 2: TrayIcon1->SetIconIndex(2); break;
     default: TrayIcon1->SetIconIndex(0); break;
   }
  }
}
//---------------------------------------------------------------------------
 Ну а что опять???. 
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
586
Дата 31.8.2007, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



с функцией PostMessage работает
PM   Вверх
Ockonal
Дата 1.9.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



Не ну я звиняюсь. Достал уже вас smile. Ничего не получается. Все делаю, меня na PostMessage.
Меняется, когда прога активна, и то с заскоками.
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
Ockonal
Дата 2.9.2007, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



Может мне кинуть сюда проект?
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
586
Дата 3.9.2007, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



тогда попробуй перехватить сообщение с помощью BEGIN_MESSAGE_MAP
 cpp
Код
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::wm_user_1(TMessage &msg)
{
  Beep(0x1FF, 50);
  Caption=msg.WParam;  // осторожно с FindWindow (заголовок формы изменится)
}

h
Код
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
private:
        void __fastcall wm_user_1(TMessage &msg);
public:
        __fastcall TForm1(TComponent* Owner);
        BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER(WM_USER+1, TMessage, wm_user_1);
        END_MESSAGE_MAP(TComponent);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

PM   Вверх
Ockonal
Дата 5.9.2007, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Smile
*


Профиль
Группа: Участник
Сообщений: 219
Регистрация: 9.7.2007
Где: Ukraine::Nikolaev ;

Репутация: нет
Всего: 3



Всем спасибо smile Вот тя работает smile Тема закрыта
--------------------
Ум заключается не только в знании, но и в умении прилагать знание на деле.Самое лучшее из всех доказательств есть опыт.Каждому человеку свойственно ошибаться, но никому, кроме глупца, несвойственно упорствовать в ошибке.
PM MAIL WWW ICQ Skype GTalk Jabber MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.