Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2008, 15:34   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
По идеи сообщение надо будет дальше послать
Если это не хук то не требуется принудительного посылания дальше по цепочке.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.07.2008, 15:40   #12
soufee
 
Регистрация: 09.07.2008
Сообщений: 8
По умолчанию

Из буфера обмена вставляется.. а в буфер не забирается.
То что было, то и ставится в эдит
soufee вне форума Ответить с цитированием
Старый 10.07.2008, 15:55   #13
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

soufee, ещё раз, если Вы хотите сделать как в Лингво, то Лингво ничего никуда не "забирает", а пользуется буфером, который был заполнен стандартным образом - через ^C или ^Ins. Если только в ABBYY не произошла революция и версии после десятой не стали работать иначе. Если Вы не хотите сделать, как в Лингво, то просто отправляйте тому окну, в которое идёт сообщение о клавише, WM_COPY, отправлять желательно осторожно, скажем через SendMessageTimeout, а потом давайте соответствующую команду своему приложению.
B_N вне форума Ответить с цитированием
Старый 10.07.2008, 15:55   #14
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Проблема решится если добавить код
Код:
procedure TForm1.FormCreate(Sender: TObject);
var Hwnd_: Hwnd;
begin
  Hwnd_ := SetClipboardViewer(Handle);
end;
eoln вне форума Ответить с цитированием
Старый 10.07.2008, 16:43   #15
soufee
 
Регистрация: 09.07.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от eoln Посмотреть сообщение
Проблема решится если добавить код
Код:
procedure TForm1.FormCreate(Sender: TObject);
var Hwnd_: Hwnd;
begin
  Hwnd_ := SetClipboardViewer(Handle);
end;
Ничего не изменилось.

B_N, как в лингво не получится, т.к. в этом случае моя программа будет конфликтовать с лингво. придется делать по другому.
У меня определены клавиши CTRL+F8. Надо чтобы при нажатии именно на эти клавиши происходила операция.
soufee вне форума Ответить с цитированием
Старый 10.07.2008, 16:57   #16
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Приведёный код работает при CTRL+C, т.е при копировании в буфер
Код:
unit Unit1;
  
interface   
  
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, StdCtrls, ClipBrd;   
  
type   
  TForm1 = class(TForm)   
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
private
  procedure WMDrawClipboard(var Msg: TWMDrawClipboard);
    message WM_DRAWCLIPBOARD;   
  public   
    { Public declarations }   
  end;   
  
var   
  Form1: TForm1;

implementation   
  
{$R *.dfm}

procedure TForm1.WMDrawClipboard(var Msg: TWMDrawClipboard);   
var   
  P: PChar;   
  H: THandle;
begin   
  if Clipboard.HasFormat(CF_TEXT) then
  begin   
    H := Clipboard.GetAsHandle(CF_TEXT);   
    P := GlobalLock(H);
    Edit1.SetTextBuf(P);
    GlobalUnlock(H)
  end
end;
  
procedure TForm1.FormCreate(Sender: TObject);
var Hwnd_: Hwnd;
begin
  Hwnd_ := SetClipboardViewer(Handle);
end;
  
end.
Цитата:
У меня определены клавиши CTRL+F8
Ну тогда регистрирует горячии клавиши и выполняем procedure TForm1.WMDrawClipboard при событии
eoln вне форума Ответить с цитированием
Старый 12.07.2008, 18:09   #17
soufee
 
Регистрация: 09.07.2008
Сообщений: 8
По умолчанию

У меня получилось так
Цитата:
procedure Tform1.WMHotKey (var Message: TMessage);
var
bufHnd: HWND;
bufLen: integer;
bufLenStart, bufLenEnd: integer;
bufTextLen: integer;
P: PChar;
begin
inherited;
bufHnd := GetTopWindow(GetForeGroundWindow);

SendMessage(bufHnd, EM_GETSEL, Longint(@bufLenStart), Longint(@bufLenEnd));
bufTextLen := SendMessage(bufHnd, WM_GETTEXTLENGTH, 0, 0);
bufLen := bufLenEnd - bufLenStart;

SetString(SelectedText, PChar(nil), bufLen);
if bufLen <> 0 then
begin
P := StrAlloc(bufTextLen + 1);
try
SendMessage(bufHnd, WM_GETTEXT, StrBufSize(P), Longint(P));
Move(P[bufLenStart], Pointer(SelectedText)^, bufLen);
finally
StrDispose(P);
end;
end;

application.Restore;
application.bringtofront;
edit1.Text:=selectedtext;
Ic(2,Application.Icon); // Удаляем значок из трея
ShowWindow(Application.Handle,SW_SH OW); // Восстанавливаем кнопку программы
ShowWindow(Handle,SW_SHOW);
end;
Работает в блокноте. В других программах не работает. Выскакивает ошибка Out of memory. С чем это может быть связано?
soufee вне форума Ответить с цитированием
Старый 15.07.2008, 22:58   #18
soufee
 
Регистрация: 09.07.2008
Сообщений: 8
По умолчанию

ООООчень прошу помочь мне. Дело очень важное
soufee вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как очистить буфер обмена? StasSv Microsoft Office Excel 2 11.08.2008 17:38
Как скопировать текст в буфер обмена с одного edit-a и вставить в другой SeRhy Общие вопросы Delphi 2 26.07.2008 23:02
Скопировать в буфер обмена Dj_smart JavaScript, Ajax 8 15.05.2008 19:16
обновление в блоге - Programmersforum.ru toolbar – тулбар для нашего клуба Pblog Обсуждение статей 0 13.12.2007 20:20
Копирование структуры в буфер обмена bill Общие вопросы Delphi 14 20.11.2007 17:22