![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Использование 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-окна не обрабатывают это сообщение