Текущий архив: 2004.06.06;
Скачать: CL | DM;
Вниз
Использование SendMessage Найти похожие ветки
← →
funkster (2004-04-20 17:53) [0]Здравствуйте!
Пишу прогу, которая должна по нажатию горячей клавиши вставлять определённый текст в активное текстовое поле (в активной проге) (Будь это combobox, richedit или ячейка в Excel)
Использовал следующий код:
AttachThreadInput(GetWindowThreadProcessId(GetForegroundWindow, nil), GetCurrentThreadId, True);
winhwnd:=GetFocus;
SendMessage(winhwnd, WM_SETTEXT, 0,Integer(PChar("Сообщение")));
В блокнот вставляет, и почти никуда больше не хочет ((((
← →
clickmaker © (2004-04-20 18:04) [1]Значит остальные foreground-окна не обрабатывают это сообщение
← →
funkster (2004-04-20 18:06) [2]А как сделать, чтобы обрабатывали?
← →
clickmaker © (2004-04-20 18:13) [3]
> funkster (20.04.04 18:06) [2]
> А как сделать, чтобы обрабатывали?
Накатать жалобу разработчикам этих прог.
Или искать нужное среди дочерних окон этого самого Foreground Window, FindWindowEx()
← →
Ajax © (2004-04-20 19:57) [4]ИМХО лучше помещать в буфер, а от туда вставлять куда надо.
← →
Kolyan © (2004-04-21 08:47) [5]
> Ajax © (20.04.04 19:57) [4]
Эт точно
← →
Отто (2004-04-21 09:23) [6]Странно, у меня работало почти везде. Может дай более подробный листинг кода? В крайнем случае можно спичаться, я кину свои исходники.
← →
funkster (2004-04-21 11:06) [7]> Ajax ©
ага, сделал WM_PASTE вместо WM_SETTEXT
плюс вот это:
Clipboard.clear;
Clipboard.HasFormat(CF_OEMTEXT);
Clipboard.asText:="Текст";
и всё отлично работает)))))))))
← →
funkster (2004-04-21 11:09) [8]> Отто
Пасибки, уже по другому сделал, но исходники всёравно кинь, посмотреть интересно)))
← →
BaDeVlad © (2004-04-22 10:16) [9]
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 берет текст из текущего окна в скобки.
← →
narayan © (2004-04-22 10:41) [10]2 funkster (21.04.04 11:06) [7]
а то что ты пользователю содержимое буфера обмена портишь - пофиг?
← →
Ajax © (2004-04-23 09:22) [11]Перед тем, как что-то копировать в буфер обмена, нужно сохранить информацию там находящуюся. Потом копируешь текст, обрабатываешь, что хочешь и восстанавливаешь исходные данные в буфере.
Страницы: 1 вся ветка
Текущий архив: 2004.06.06;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.019 c