Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.051 c
4-1083538982
Equillibrium
2004-05-03 03:03
2004.06.06
Как динамически создавать TrackBar (ползунок)


14-1085050729
Том
2004-05-20 14:58
2004.06.06
Как решить задачу !


14-1084925158
Serzh ml
2004-05-19 04:05
2004.06.06
(win XP) vs (win NT+9x)


3-1084781987
Andrey_ck
2004-05-17 12:19
2004.06.06
QReport


3-1084792312
Емахо!
2004-05-17 15:11
2004.06.06
DataSet.Filter как присвоить строку фильтра?