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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2009, 16:42   #1
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию Передача символа другому окну

Есть идея сделать аналог Punto Switcher.
Как передать символ полю, в котором я в данный момент печатаю?
Пробовал так:
Код:
  acform,fild: hwnd;
.....
    acform:=getactivewindow;
    fild:=GetWindow(acform,GW_CHILD);
   SendMessage(fild,WM_SETTEXT,0,LongInt(PChar('f')));
Не работает... что я делаю не так?
dimonbest вне форума Ответить с цитированием
Старый 26.05.2009, 16:48   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
WM_SETTEXT
Это сообщение посылается для смены заголовка или текстов в Эдитах
Тебе видимо нужно WM_CHAR
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.05.2009, 17:10   #3
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Так тоже не работает...
dimonbest вне форума Ответить с цитированием
Старый 26.05.2009, 18:32   #4
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

а ты попробуй просто отлавливать нажатия клавишь в системе.. просто постаь хук на клавиатуру..
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 26.05.2009, 18:47   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
var
  Wnd: HWND;
  Len: Integer;
  Buf: PWChar;
  C: Char;
begin
  // Wnd - your window
  // C - your character
  Len := GetWindowTextLengthW(Wnd) + 1;
  GetMem(Buf, (Len + 1) * SizeOf(WChar));
  if (Len > 1) then
    GetWindowTextW(Wnd, Buf, Len - 1);
  // adding C into the end of Buf
  PWChar(Integer(Buf) + (Len - 1) * SizeOf(WChar))^ := C;
  // Set window's text
  SetWindowTextW(Wnd, Buf);
end;
BOBAH13 вне форума Ответить с цитированием
Старый 27.05.2009, 10:17   #6
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от Ntlegend Посмотреть сообщение
а ты попробуй просто отлавливать нажатия клавишь в системе.. просто постаь хук на клавиатуру..
Это для меня слишком сложно...

to BOBAH13 Не работает, сделал так:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
  Wnd: HWND;
  Len: Integer;
  Buf: PWChar;
  C: Char;
begin
  // Wnd - your window
  // C - your character
  wnd:=getactivewindow;
  Len := GetWindowTextLengthW(Wnd) + 1;
  GetMem(Buf, (Len + 1) * SizeOf(WChar));
  if (Len > 1) then
    GetWindowTextW(Wnd, Buf, Len - 1);
  // adding C into the end of Buf
  PWChar(Integer(Buf) + (Len - 1) * SizeOf(WChar))^ := 'C';
  // Set window's text
  SetWindowTextW(Wnd, Buf);
end;

Последний раз редактировалось Stilet; 28.05.2009 в 12:01.
dimonbest вне форума Ответить с цитированием
Старый 27.05.2009, 12:32   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну для начала... проверьте что за окно Wnd := GetActiveWindow; потом попробуйте перед SetWindowTextW вызвать MessageBoxW(0, Buf, '', 0); и что он вам покажет (должен показать текст окна активного, и + ваш символ)

И еще, "не работает" - это не проблема, что не работает ?
BOBAH13 вне форума Ответить с цитированием
Старый 27.05.2009, 12:44   #8
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Ну для начала... проверьте что за окно Wnd := GetActiveWindow;
А как это сделать?
Поставил MessageBoxW(0, Buf, '', 0);
В переменной Buf какая то чепуха (не тот текст который в активном окне).
Может неправильно нашел активное окно?
dimonbest вне форума Ответить с цитированием
Старый 27.05.2009, 14:25   #9
rangel
Пользователь
 
Регистрация: 31.10.2007
Сообщений: 65
По умолчанию

Код:
var
wnd,wnd2: HWND;
 m:integer;

begin
wnd := FindWindow(nil,'Заголовок окна');
if wnd <> 0 then
begin
//Потихоньку переходим к нужному полю
//Для определения нужного поля используйте
//программу WinSpector Spy
     wnd := FindWindowEx(wnd, 0,'GG_SplitterWindow', nil); 
     wnd := FindWindowEx(wnd, 0,'GG_SplitterWindow', nil);
     wnd := FindWindowEx(wnd, 0,'GG_SWITCHVIEW', nil);
     wnd := FindWindowEx(wnd, 0,'#32770', nil);
     wnd2 := FindWindowEx(wnd, 0,'RichEdit20W', nil);
//Это пример я нашел нужное поле
//ниже отсылаем тому полю которое мы нашли текст из Memo1
     for m:=0 to Length(Memo1.Text)+1 do begin
       SendMessage(wnd2, WM_CHAR, Word(Memo1.Text[m]), 0);
     end;


end;
end;
Писал сам взял код из исходников моей прожки)

Так же вот что то вроде пунто свичер, делал сам
http://dump.ru/file/2440969
Если посмотрите если нужны исходники могу выложить
Суть программы в том что ты печатаешь текст не смотря на монитор потом смотришь и видишь
вместо
привет
ghbdtn
выделяешь ghbdtn нажимаешь ctrl-r он копирует текст, вставляет в себя изменяет его на привет, и возращяет окну привет тем самым заменяя ghbdtn
также там ctrl-t транслит в рус переделывает)
С программой есть 2 файла в одном раскладка клавы например менять с й-q во второй например менять с t-т)

Цитата:
Сообщение от Ntlegend Посмотреть сообщение
а ты попробуй просто отлавливать нажатия клавишь в системе.. просто постаь хук на клавиатуру..
ну вот пример)

Последний раз редактировалось Stilet; 28.05.2009 в 12:01.
rangel вне форума Ответить с цитированием
Старый 28.05.2009, 11:17   #10
dimonbest
Форумчанин
 
Регистрация: 07.02.2008
Сообщений: 150
По умолчанию

Цитата:
Сообщение от rangel Посмотреть сообщение
Писал сам взял код из исходников моей прожки)
Не работает. Написал так:
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var
wnd,wnd2: HWND;
 m:integer;
begin
wnd := FindWindow(nil,'AkelPad');
if wnd <> 0 then
begin
//Потихоньку переходим к нужному полю
//Для определения нужного поля используйте
//программу WinSpector Spy
     wnd := FindWindowEx(wnd, 0,'GG_SplitterWindow', nil);
     wnd := FindWindowEx(wnd, 0,'GG_SplitterWindow', nil);
     wnd := FindWindowEx(wnd, 0,'GG_SWITCHVIEW', nil);
     wnd := FindWindowEx(wnd, 0,'#32770', nil);
     wnd2 := FindWindowEx(wnd, 0,'RichEdit20W', nil);
//Это пример я нашел нужное поле
//ниже отсылаем тому полю которое мы нашли текст из Memo1
     for m:=0 to Length(Memo1.Text)+1 do begin
       SendMessage(wnd2, WM_CHAR, Word(Memo1.Text[m]), 0);
     end;
end;
end;
Запустил AkelPad, таймер... а в нем ничего тне появляется... что я делаю не так?
dimonbest вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по активному окну san72 Общие вопросы Delphi 11 07.03.2009 12:05
Добавление меню к окну приложения... MaTBeu Win Api 2 24.09.2008 20:23
от консоли к окну ёжик Общие вопросы C/C++ 3 06.04.2008 17:51
Сообщение другому окну Бонарт Win Api 13 15.08.2007 20:23
Мнимое сообщение окну/компоненту об изменении параметров дисплея Megabotan Win Api 5 08.01.2007 13:54