Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кнопка в чужом приложении, Как создать 
:(
    Опции темы
RedArrow
Дата 28.9.2004, 09:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Подскажите, пожалуйста, как добавить свою кнопку в чужое приложение? Например, в Outlook Express?
  Вверх
Georg4
Дата 28.9.2004, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 961
Регистрация: 2.11.2002

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



Что ты имеешь под "Своей кнопкой". Совершенно левую кнопку или из стандартных кнопок приложения (как в Ворде) с твоими коммандами в неё заделанными


--------------------
Никто и никогда не должен решать одну проблему дважды
PM MAIL ICQ   Вверх
RedArrow
Дата 28.9.2004, 09:44 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Можно стандартную, но что бы она выполняла мои функции. Либо, если это невозможно, то "совершенно левую", опять же, с моими функциями.
  Вверх
p0s0l
Дата 28.9.2004, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Создать кнопку можно так:
Код
wndBtn := CreateWindowEx (WS_EX_NOPARENTNOTIFY or WS_EX_TOPMOST, 'BUTTON', 'Test', WS_VISIBLE or WS_CHILDWINDOW,
           220, 62, 40, 29, wnd, 0, 0, nil);
Здесь wnd - хэндл окна, в котором будет создана кнопка. В данном случае создалась корявая такая кнопка, но ты можешь сделать и красивее... Почитай подробнее об CreateWindowEx, стилях и др...

Далее нужно сделать обработчик нажатия кнопки. Есть два пути, которые я тебе могу предложить:
1) Записать в виртуальное пространство чужого процесса свой обработчик.
2) Поставить ловушку (хук).

Немного расскажу про второй способ.
Делаем DLL примерно такого содержания:
Код
library HookDLL;

uses
 Windows, Messages, uGlobal;

{$R *.res}

function HookProc (nCode : integer; wP : WPARAM; lP : LPARAM) : LRESULT; stdcall;
var
 msg : ^CWPSTRUCT absolute lP;

begin
 OpenMap;
 if nCode >= 0 then
   if (msg.message = WM_COMMAND) and
      (msg.lParam = GlobalData.wndButton) then
     PostMessage (GlobalData.wndMain, WM_USER, msg.hwnd, msg.lParam);

 Result := CallNextHookEx (GlobalData.hook, nCode, wP, lP);
 CloseMap;
end;

function InstallHook (wnd : HWND; tid : DWORD; wndBtn : HWND) : HHOOK;
begin
 CreateMap;
 GlobalData.wndMain := wnd;
 GlobalData.hook := SetWindowsHookEx (WH_CALLWNDPROC, @HookProc, hInstance, tid);
 GlobalData.wndButton := wndBtn;
 Result := GlobalData.hook;
end;

procedure UninstallHook;
begin
 if GlobalData.hook <> 0 then UnhookWindowsHookEx (GlobalData.hook);
 CloseMap;
end;

exports
 InstallHook,
 UninstallHook;

end.
Вызов InstallHook установит ловушку, UninstallHook - уберёт хук.
При клике на кнопку хук проверяет, если нажали на созданную нами кнопку, то шлет сообщение WM_USER окну нашей проги.

Тут используется модуль uGlobal:
Код
unit uGlobal;

interface

uses windows;

type
 PGlobalData = ^TGlobalData;
 TGlobalData = record
   wndMain : HWND;
   hook : HHOOK;
   wndButton : HWND;
 end;

var
 hGlobalMap : THandle;
 GlobalData : PGlobalData;

const
 MapName = 'sharemap1';

procedure CreateMap;
procedure OpenMap;
procedure CloseMap;

implementation

procedure CreateMap;
begin
 if GlobalData <> nil then CloseMap;
 hGlobalMap := CreateFileMapping (INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(GlobalData^), MapName);
 GlobalData := MapViewOfFile (hGlobalMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
 ZeroMemory (GlobalData, SizeOf(GlobalData^));
end;

procedure OpenMap;
begin
 if GlobalData <> nil then CloseMap;
 hGlobalMap := OpenFileMapping (FILE_MAP_ALL_ACCESS, False, MapName);
 GlobalData := MapViewOfFile (hGlobalMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
end;

procedure CloseMap;
begin
 if GlobalData <> nil then UnmapViewOfFile (GlobalData);
 GlobalData := nil;
 if hGlobalMap <> 0 then CloseHandle (hGlobalMap);
 hGlobalMap := 0;
end;

end.
Этот модуль нужен типа для создания куска общедоступной памяти. В этой памяти хранится хэндл окна нашей проги, хэндл хука, и хэндл созданной кнопки.

Ну а дальше сам пример установки хука:
Код
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ShellAPI, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure UserMessage (var msg : TMessage); message WM_USER;
 private
 public
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

var hook : HHOOK;

function InstallHook (wnd : HWND; tid : DWORD; wndBtn : HWND) : HHOOK; external 'HookDLL.dll';
procedure UninstallHook; external 'HookDLL.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
 tid : DWORD;
 wnd, wndBtn : HWND;

begin
 ShellExecute (0, 'open', 'calc.exe', nil, nil, SW_SHOWNORMAL);
 Sleep(1000);
 
 wnd := FindWindow(nil, 'Calculator');
 if wnd = 0 then exit;
 tid := GetWindowThreadProcessId (wnd);
 wndBtn := CreateWindowEx (WS_EX_NOPARENTNOTIFY or WS_EX_TOPMOST, 'BUTTON', 'Test', WS_VISIBLE or WS_CHILDWINDOW,
           220, 62, 40, 29, wnd, 0, 0, nil);

 hook := InstallHook (Handle, tid, wndBtn);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 hook := 0;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if hook <> 0 then UninstallHook;
end;

procedure TForm1.UserMessage (var msg : TMessage);
begin
 ShowMessage ('Clicked!');
end;

end.
Когда жмешь Button1 запустится калькулятор, и в нём создастся кнопка "Test".
Если нажмешь на эту кнопку, твоё приложение получит сообщение WM_USER, и выдаст сообщение...




--------------------
С уважением, г-н Посол.
PM   Вверх
Staszek
Дата 29.9.2004, 12:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А про первый способ расскажи!!!
  Вверх
p0s0l
Дата 29.9.2004, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Цитата(Staszek @ 29.9.2004, 12:58)
А про первый способ расскажи!!!

А чем тебе второй не понравился ?... sad.gif
С первым _намного_ больше геморроя, так что лучше разберись с тем, что есть...


--------------------
С уважением, г-н Посол.
PM   Вверх
RedArrow
Дата 30.9.2004, 07:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.9.2004

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



p0s0l
Спасибо, Ваша помощь пришлась как нельзя кстати.
PM MAIL   Вверх
Darksquall
Дата 30.9.2004, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2004
Где: Москва

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



А еще есть способ через OLE,
форму с кнопочкой создаешь заранее и вставляешь на форму OLE контейнер, указываешь в контейнере тип твоего приложения.
И все.
Я так сделал в ВОРДЕ, когда нужно было ограничить юзера в сохранении документа. т.е. он сохраняет документ только с помощью моей кнопки.А так все стандартные панели остались на месте.



--------------------
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

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

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


 




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


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

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