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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Wm_past на edit как с этим работать... Wm_past 
:(
    Опции темы
Grol
Дата 2.5.2005, 00:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет всем! Вот я пишу:

Код

Private
procedure wmpaste(var Msg:TWMPaste); Message wm_paste;
...
procedure Tform1.WmPaste(var Msg:TWMPaste);
begin
  if Msg.Msg=Wm_Paste then
  Form1.edit1.Text:='Вставка!!!';
  inherited;
end;


Я хочу, чтобы по нажатию на форме ctrl+V у меня в edit вводилась "вставка", как по коду видно. При этом edit неактивный, чтоб на нем небыло фокуса. То есть должно чисто отлавливаться сообщение wm_paste. Помогите мне пожалуйста разобраться и поподробнее. Буду очень преочень благодарен всем кто поможет мнне!!!
P.S.: Ведь все когда-то так начинали с нуля изучать Delphi.

Это сообщение отредактировал(а) Alex - 2.5.2005, 00:24
  Вверх
dvamaster
Дата 2.5.2005, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



WM_PASTE работает только на контролах у которых есть поле ввода.

Отлавливай простое нажатие Ctrl+V


--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
Guest
Дата 2.5.2005, 14:17 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вот как раз мне и нужно не нажатие клавиши отловить, так как это я знаю, а само сообщение wm_paste которое будет посылаться от нажатия. То есть типа хука. Только я не знаю как это сделать. Так как в Delphi я недавно начал программировать. Подскажите пожалуйста...буду очень благодарен.
  Вверх
Guest
Дата 2.5.2005, 22:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мастера В Delphi помогите мне, Ламеру в программировании, на вас вся надежда... Я бы сам, но я все smile перепробывал у меня ничего не получается. Подскажите мне буду очень вам благодарен за оказанную помощь!!! smile smile smile
  Вверх
Zero
Дата 2.5.2005, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

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



Цитата(Grol @ 2.5.2005, 00:19)
Я хочу, чтобы по нажатию на форме ctrl+V у меня в edit вводилась "вставка"
Всмысле на форме, а она же не может получать фокус ввода.
Но если тебе нужно просто, по нажатию на другом элементе, чтобы в нужный тебе edit, в частности в первый вводилась вставка, то делай это на событие нажатия клавиши (OnKeyDown, или OnKeyPress, или OnKeyUp).
Вчастности пример: прось на форму 2 edit'a и на событие OnKeyPress 2-ого edit'a напиши:
Код

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  if key=#22 then edit1.Text:='Вставка';
end; 

PM MAIL ICQ   Вверх
Yanis
Дата 2.5.2005, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ПО моему, в этом случае надо отлавливать не WM_PASTE, а комбинацию клавишь. Вот мой вариант:
Код

procedure TForm1.WMKEYDOWN(var Message: TWMKEYDOWN);
begin
  Inherited;
  If ((GetKeyState(VK_CONTROL) and 128) = 128) and (((GetKeyState(Ord('V')) and 128) = 128)or((GetKeyState(Ord('v')) and 128) = 128)) then
    MessageBox(Handle, PChar('Combination of keys "Ctrl + V" is pressed'), PChar('Key pressed...'), MB_ICONINFORMATION);
end;



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Grol
Дата 2.5.2005, 23:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мастера спасибо за то что уже что-то подсказали, но вот дело еще в следующем. Я ненапрасно код привел в начале всего обсуждения. Мне нужно, чтобы соообщение отлаваливалось от нажатия а не само нажатие, т.е. вместо ctrl+V может быть и shift+insert, и также правая кнопка мыши и в опциях вставить. А как тогда действовать. Буду ждать ответа, если кто захочет помочь. Спасибо за все. "Век буду должен."
  Вверх
Poseidon
Дата 3.5.2005, 00:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

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



Grol, как же ты не поймешь! Сообщения от Виндовс, в твоем случае, получает окно (или по-просту форма), а форма не имеет поля ввода. Следовательно форма не обрабатывает сообщение WM_PASTE, она его просто игнорирует!
Цитата(dvamaster @ 2.5.2005, 06:40)
WM_PASTE работает только на контролах у которых есть поле ввода.


Так что сделать что-то
Цитата(Guest @ 2.5.2005, 14:17)
типа хука
, для этого сообщения не удасться smile (если я не прав, то поправте).



--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Rouse_
Дата 3.5.2005, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может вот это подойдет?

Код

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    OldWindowProc: TWndMethod;
    procedure NewEditWindowProc(var Message: TMessage);
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormCreate(Sender: TObject);
begin
  // Запоминаем старую оконную процедуру
  OldWindowProc := Edit1.WindowProc;
  // Заменяем ее новой
  Edit1.WindowProc := NewEditWindowProc;
end;

procedure TForm2.NewEditWindowProc(var Message: TMessage);
begin
  // перехватываем сообщение о вставке
  if Message.Msg = WM_PASTE then
    Edit1.Text := 'Вставка!!!'
  else
    OldWindowProc(Message);
end;

end.

Добавлено @ 11:37
Цитата(Poseidon @ 3.5.2005, 01:57)
Сообщения от Виндовс, в твоем случае, получает окно (или по-просту форма), а форма не имеет поля ввода.

Не может она его получать.

Цитата
An application sends a WM_PASTE message to an edit control or combo box to copy the current content of the clipboard to the edit control at the current caret position. Data is inserted only if the clipboard contains data in CF_TEXT format.

lResult = SendMessage(      // returns LRESULT in lResult   
  (HWND) hWndControl,      // handle to destination control   
  (UINT) WM_PASTE,      // message ID   
  (WPARAM) wParam,      // = (WPARAM) () wParam; 
  (LPARAM) lParam      // = (LPARAM) () lParam; ); 

таким образом форма не является получателем...

Это сообщение отредактировал(а) Rouse_ - 3.5.2005, 11:33


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Girder
Дата 3.5.2005, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



smile
Код
//...
type
 TOP_H = packed record
  Push:Byte;
  Address:DWord;
  Ret:Byte;
 end;

var
  Form1: TForm1;
  WPM:DWord;
  fPaste:Boolean=false;
  fKeyPaste:Boolean=false;
  OC,KS:Pointer;
  OP:DWord;
  OP_H1,Reserve1,OP_H2,Reserve2:TOP_H;
  mKS:TKeyboardState;

implementation

{$R *.dfm}

function CheckPasteKey():boolean;
begin
 Result:=false;
 GetKeyboardState(mKS);
 if (((mKS[17] and mKS[86])and $80)=$80)or(((mKS[16] and mKS[45])and $80)=$80) then
  begin
   mKS[45]:=0;
   mKS[86]:=0;
   SetKeyboardState(mKS);
   Result:=true;
  end;
end;

procedure SaveEdit();
begin
 Form1.Edit1.Text:='Вставка!!!';
end;

procedure Open_Clipboard;stdcall;
begin
 asm
  pushad
 end;
 WriteProcessMemory(OP,OC,@Reserve1,SizeOf(Reserve1),WPM);
 asm
  popad
  mov eax,[esp+4]
  push eax
  mov eax,OC
  call eax
  pushad
 end;
 WriteProcessMemory(OP,OC,@OP_H1,SizeOf(OP_H1),WPM);
 SaveEdit;
 asm
  popad
  ret +4
 end;
end;

procedure Get_KeyState;stdcall;
begin
 asm
  pushad
 end;
 WriteProcessMemory(OP,KS,@Reserve2,SizeOf(Reserve2),WPM);
 asm
  popad
  mov eax,[esp+4]
  push eax
  mov eax,KS
  call eax
  pushad
 end;
 WriteProcessMemory(OP,KS,@OP_H2,SizeOf(OP_H2),WPM);
 if CheckPasteKey then SaveEdit;
 asm
  popad
  ret +4
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var Dll:DWord;
begin
 FillChar(mKS,SizeOf(mKS),#0);
 SetKeyboardState(mKS);
 DLL:=LoadLibrary('user32.dll');
 if DLL<>0 then
  begin
   OC:=GetProcAddress(DLL,'OpenClipboard');
   KS:=GetProcAddress(DLL,'GetKeyState');
   if (OC<>nil)and(KS<>nil) then
    begin
     OP:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID);
     if OP<>0 then
      begin
       OP_H1.Push:=$68;
       OP_H1.Address:=DWord(@Open_Clipboard);
       OP_H1.Ret:=$C3;
       ReadProcessMemory(OP,OC,@Reserve1,SizeOf(Reserve1),WPM);
       WriteProcessMemory(OP,OC,@OP_H1,SizeOf(OP_H1),WPM);
       OP_H2.Push:=$68;
       OP_H2.Address:=DWord(@Get_KeyState);
       OP_H2.Ret:=$C3;
       ReadProcessMemory(OP,KS,@Reserve2,SizeOf(Reserve2),WPM);
       WriteProcessMemory(OP,KS,@OP_H2,SizeOf(OP_H2),WPM);
      end;
    end;
   FreeLibrary(Dll);
  end;
end;

//...


Это сообщение отредактировал(а) Girder - 3.5.2005, 16:02


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Rouse_
Дата 3.5.2005, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Girder, ну нифига себе smile
Это ж из пушки по воробьям smile)))))))


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Girder
Дата 3.5.2005, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Цитата(Rouse_ @ 3.5.2005, 17:10)
Girder, ну нифига себе  smile
Это ж из пушки по воробьям smile)))))))
Зато... не важно сколько контролов на форме... сколько форм в проекте... где фокус... smile

PS: Да и вообще... ты забыл!!! об всяких там "диалогах" (OpenDialog, SaveDialog...), MessageBox-ах и т.д. и т.п. smile - а данному коду на все енто... по барабану smile

Это сообщение отредактировал(а) Girder - 3.5.2005, 16:35


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Rouse_
Дата 3.5.2005, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Girder @ 3.5.2005, 17:17)
Да и вообще... ты забыл!!! об всяких там "диалогах" (OpenDialog, SaveDialog...), MessageBox-ах и т.д. и т.п.  - а данному коду на все енто... по барабану 

Угу, только проще застрелиться чем отлавливать откуда вставка пришла и делать инвариантный выбор на несколько контролов smile
Лучше уж наследника от едита написать и не париться (благо это целиком соответствует вопросу без выхода за рамки) smile


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Girder
Дата 4.5.2005, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


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

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



Цитата(Rouse_ @ 3.5.2005, 23:26)
Угу, только проще застрелиться чем отлавливать откуда вставка пришла и делать инвариантный выбор на несколько контролов smile
Уже застрелился... smile

Код
type
 TOP_H = packed record
  Push:Byte;
  Address:DWord;
  Ret:Byte;
 end;

var
  Form1: TForm1;
  WPM:DWord;
  fPaste:Boolean=false;
  fKeyPaste:Boolean=false;
  OC,KS:Pointer;
  OP:DWord;
  OP_H1,Reserve1,OP_H2,Reserve2:TOP_H;
  mKS:TKeyboardState;
  Win:HWND;

implementation

{$R *.dfm}

function CheckPasteKey():boolean;
begin
 Result:=false;
 GetKeyboardState(mKS);
 if (((mKS[17] and mKS[86])and $80)=$80)or(((mKS[16] and mKS[45])and $80)=$80) then
  begin
   mKS[45]:=0;
   mKS[86]:=0;
   SetKeyboardState(mKS);
   Result:=true;
  end;
end;

procedure SaveEdit();
var CN:array [0..1024] of char;
begin
 GetClassName(Win,CN,1024);
 Form1.Edit1.Text:={'Вставка!!!'}CN;
end;

procedure Open_Clipboard;stdcall;
begin
 asm
  pushad
 end;
 WriteProcessMemory(OP,OC,@Reserve1,SizeOf(Reserve1),WPM);
 asm
  popad
  mov eax,[esp+4]
  mov Win,eax
  push eax
  mov eax,OC
  call eax
  pushad
 end;
 WriteProcessMemory(OP,OC,@OP_H1,SizeOf(OP_H1),WPM);
 SaveEdit;
 asm
  popad
  ret +4
 end;
end;

procedure Get_KeyState;stdcall;
begin
 asm
  pushad
 end;
 WriteProcessMemory(OP,KS,@Reserve2,SizeOf(Reserve2),WPM);
 asm
  popad
  mov eax,[esp+4]
  push eax
  mov eax,KS
  call eax
  pushad
 end;
 WriteProcessMemory(OP,KS,@OP_H2,SizeOf(OP_H2),WPM);
 Win:=GetFocus;
 if CheckPasteKey then SaveEdit;
 asm
  popad
  ret +4
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var Dll:DWord;
begin
 FillChar(mKS,SizeOf(mKS),#0);
 SetKeyboardState(mKS);
 DLL:=LoadLibrary('user32.dll');
 if DLL<>0 then
  begin
   OC:=GetProcAddress(DLL,'OpenClipboard');
   KS:=GetProcAddress(DLL,'GetKeyState');
   if (OC<>nil)and(KS<>nil) then
    begin
     OP:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID);
     if OP<>0 then
      begin
       OP_H1.Push:=$68;
       OP_H1.Address:=DWord(@Open_Clipboard);
       OP_H1.Ret:=$C3;
       ReadProcessMemory(OP,OC,@Reserve1,SizeOf(Reserve1),WPM);
       WriteProcessMemory(OP,OC,@OP_H1,SizeOf(OP_H1),WPM);
       OP_H2.Push:=$68;
       OP_H2.Address:=DWord(@Get_KeyState);
       OP_H2.Ret:=$C3;
       ReadProcessMemory(OP,KS,@Reserve2,SizeOf(Reserve2),WPM);
       WriteProcessMemory(OP,KS,@OP_H2,SizeOf(OP_H2),WPM);
      end;
    end;
   FreeLibrary(Dll);
  end;
end;


PS: Посчитай... сколько строчек изменилось(добавилось)... что бы реализовать твою идею... smile (Посмотри что выводится в Edit1)

PS2: Жду еще идей... smile "А если завтра война?! А я везу макороны!" smile

Это сообщение отредактировал(а) Girder - 4.5.2005, 02:11


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Grol
Дата 4.5.2005, 00:43 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо за помощь...Все получилось!!! smile smile Обязательно укажу вас и ваш форум в своей программе!!! Еще раз большое спасибо.
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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