Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование SendMessage [D6, Win95/98, WinXP]


funkster ©   (2004-04-20 17:53:00) 

Здравствуйте!
Пишу прогу, которая должна по нажатию горячей клавиши вставлять определённый текст в активное текстовое поле (в активной проге) (Будь это combobox, richedit или ячейка в Excel)
Использовал следующий код:

AttachThreadInput(GetWindowThreadProcessId(GetForegroundWindow, nil), GetCurrentThreadId, True);
winhwnd:=GetFocus;
SendMessage(winhwnd, WM_SETTEXT, 0,Integer(PChar('Сообщение')));

В блокнот вставляет, и почти никуда больше не хочет ((((


Ajax   (2004-04-23 09:22:00) [1]

Перед тем, как что-то копировать в буфер обмена, нужно сохранить информацию там находящуюся. Потом копируешь текст, обрабатываешь, что хочешь и восстанавливаешь исходные данные в буфере.


narayan   (2004-04-22 10:41:00) [2]

2 funkster   (21.04.04 11:06) [7]

а то что ты пользователю содержимое буфера обмена портишь - пофиг?


BaDeVlad   (2004-04-22 10:16:00) [3]

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure ON_WM_HOTKEY(var M: TWMHOTKEY); message WM_HOTKEY;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 hID: Integer;

implementation

{$R *.DFM}

function ExGetText(Handle:Thandle):String;
begin
SetLength(Result, SendMessage(Handle, WM_GETTEXTLENGTH, 0, 0)+1);
 SendMessage(Handle, WM_GETTEXT, length(Result), Integer(PChar(Result)));
SetLength(Result, lStrLen(PChar(Result)));
end;

procedure ExSetText(Handle: THandle; Text:String);
begin
SendMessage(Handle, WM_SETTEXT, 0, Integer(PChar(Text)));
end;

procedure TForm1.ON_WM_HOTKEY(var M: TWMHOTKEY);
var h, f: hwnd;
   s: string;
begin
if M.HotKey = 50258 {Ctrl+2} then
begin
h:= GetForegroundWindow;
h:= GetWindowThreadProcessId(h,nil);
AttachThreadInput(GetCurrentThreadId, h, true);
f:= GetFocus;
s:= exgettext(f);
exsettext(f, '('+s+')');
AttachThreadInput(GetCurrentThreadId, h, false);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
hID:=GlobalAddAtom('CalcHotkey');
RegisterHotKey(Form1.Handle, hID, mod_control, Ord('2'));
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnRegisterHotKey(Form1.handle, hID);
GlobalDeleteAtom(hID);
end;

end.


Работает почти везде. По нажатию горячих клавиш Ctrl+2 берет текст из текущего окна в скобки.


funkster   (2004-04-21 11:09:00) [4]

> Отто

Пасибки, уже по другому сделал, но исходники всёравно кинь, посмотреть интересно)))


funkster   (2004-04-21 11:06:00) [5]

> Ajax ©
ага, сделал WM_PASTE вместо WM_SETTEXT
плюс вот это:

Clipboard.clear;
Clipboard.HasFormat(CF_OEMTEXT);
Clipboard.asText:='Текст';

и всё отлично работает)))))))))


Отто   (2004-04-21 09:23:00) [6]

Странно, у меня работало почти везде. Может дай более подробный листинг кода? В крайнем случае можно спичаться, я кину свои исходники.


Kolyan   (2004-04-21 08:47:00) [7]


> Ajax ©   (20.04.04 19:57) [4]

Эт точно


Ajax   (2004-04-20 19:57:00) [8]

ИМХО лучше помещать в буфер, а от туда вставлять куда надо.


clickmaker   (2004-04-20 18:13:00) [9]


> funkster   (20.04.04 18:06) [2]
> А как сделать, чтобы обрабатывали?

Накатать жалобу разработчикам этих прог.
Или искать нужное среди дочерних окон этого самого Foreground Window, FindWindowEx()


funkster   (2004-04-20 18:06:00) [10]

А как сделать, чтобы обрабатывали?


clickmaker   (2004-04-20 18:04:00) [11]

Значит остальные foreground-окна не обрабатывают это сообщение


Наверх

Титульная страница Поиск, карта сайта Написать письмо