Как запустить вирт. клавиатуру в Win7, 8 и 10?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Sharfik » 17.08.2015 17:09:16

McLion писал(а):Ok... короче я выбрал этот метод, только есть одна проблемка, не могу закрыть клавиатуру.

Код: Выделить всё
SysUtils.ExecuteProcess('C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe', '', []);


А если диск не C:/ ?

Код: Выделить всё
  memo1.Lines.Add(GetEnvironmentVariable('SYSTEMDRIVE'));  //%SYSTEMDRIVE%

//Эти решили бы проблему, но один косяк, под 32битной программой видимо, всегда к папке (х86) возвращается путь.
  memo1.Lines.Add(GetEnvironmentVariable('PROGRAMFILES'));  //%PROGRAMFILES%
  memo1.Lines.Add(GetEnvironmentVariable('COMMONPROGRAMFILES')); //%COMMONPROGRAMFILES%
  memo1.Lines.Add(GetEnvironmentVariable('ProgramFiles(x86)'));
  memo1.Lines.Add(GetEnvironmentVariable('CommonProgramFiles(x86)'));
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение McLion » 17.08.2015 17:21:38

под 32битной программой видимо, всегда к папке (х86) возвращается путь.


Так вроде так и должно быть!
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Sharfik » 17.08.2015 17:31:49

McLion писал(а):Так вроде так и должно быть!


Судя по твоей задаче, тут двоякая ситуация. Вроде и удобно, а вроде и нет.
Код: Выделить всё
ShellExecute(0, 'open', PChar('notepad.exe'),'', '', SW_SHOWNORMAL);

Код запустит блокнот, а если написать TabTip, то ничего не будет. Потому что в путях поиска нет ее. И получить путь через системные переменные я не могу. Облазил реестр, там везде путь прописан "%CommonProgramFiles%\Microsoft Shared\ink\TabTip.exe". Вроде все есть, чтобы легко запустить программу, но в тоже время замкнутый круг.
Извращаться надо....
Код: Выделить всё
  s1:=GetEnvironmentVariable('COMMONPROGRAMFILES'); //%COMMONPROGRAMFILES%
  s1:=SysUtils.IncludeTrailingPathDelimiter(s1)+'Microsoft Shared\ink\TabTip.exe';
  s1:=StringReplace(s1,' (x86)','',[]);
  SysUtils.ExecuteProcess(s1, '', []);



Лень искать, но кажется ShellExecute возвращает хендл приложения или окна запущенного ею...
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение McLion » 17.08.2015 17:55:42

Я так понимаю, это вызов для 32 битной системы
Код: Выделить всё
SysUtils.ExecuteProcess('C:\Program Files (x86)\Common Files\microsoft shared\ink\TabTip32.exe', '', []);


а это для 64 битной?
Код: Выделить всё
SysUtils.ExecuteProcess('C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe', '', []);


TabTip32.exe
не запускается почему то на 64битовой системе.
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Лекс Айрин » 17.08.2015 17:59:03

Sharfik писал(а):Лень искать, но кажется ShellExecute возвращает хендл приложения или окна запущенного ею...


да, она возвращает HINST... но лично у меня это ничего не дало.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение sts » 17.08.2015 23:27:49

Thursday, February 05 2015, 12:15 AM - #Permalink
0

Actually TabTip app is closed when user chooses to hide it. So it's not bad thing to use PostMessage to close it.

Sample code:

class procedure TIPTip.Hide;
var
IPTip_Main_Window: HWND;
begin
IPTip_Main_Window := FindWindow('IPTip_Main_Window', nil);
if IPTip_Main_Window > 0 then
PostMessage(IPTip_Main_Window, WM_SYSCOMMAND, SC_CLOSE, 0);
end;

Добавлено спустя 3 минуты 33 секунды:
http://stackoverflow.com/questions/1770 ... -windows-v

всетаки какже говнокодить людям приходится изза отказа от OLE\COM\ActiveX в угоду ноющим мудакам.
sts
постоялец
 
Сообщения: 455
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение wavebvg » 17.08.2015 23:57:01

sts писал(а):PostMessage(IPTip_Main_Window, WM_SYSCOMMAND, SC_CLOSE, 0);

sts писал(а):изза отказа от OLE\COM\ActiveX

sts писал(а):в угоду ноющим мудакам

Это попытка заставить всех писать "многопоточные" приложения, которые будут уметь жрать много ресурсов. ИМХО.
Потому что древнющий OLE|COM был панацей от всех бед:
1. Импорт интерфейсов (т.е. проблемы с проверкой ошибок от невнимательности/копипаста уходит на уровень компилятора)
2. Запуск объектов по имени (при прототипировании получить результат можно просто создав объект и вызвав нужные методы - в противоположенность п.1)
3. Возможность быстрой установки/настройки (регистрация одной командой)
4. Можно начинать использовать сразу, без каких-либо запусков сервисов из вне (все делает система)

Что дает отказ от панацеи:
1. Множество альтернативных решений портируются на WIN как есть (dbus и т.п.)
2. Пишутся новые велосипеды
3. Писать под виндовс станет сложнее, зато он станет намного эффективнее работать в многопоточном режиме (вообще синхронизация через сообщения - довольно удобная, эффективная, но многословная вещь)
4. Нужно что-то новенькое, чтобы ничего делать не надо, к примеру нейросеть, которая угадывает, какой модуль должен обработать сообщение и т.п. ( :lol:, если не угадывает, Вы её ругаете :twisted:)

ЗЫ Утром не написал ответ, потому что не нашёл как это сделать через вызов из системной библиотеки (а это можно), а сейчас почитал и впечатления
wavebvg
постоялец
 
Сообщения: 355
Зарегистрирован: 28.02.2008 04:57:35

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Vadim » 18.08.2015 04:30:47

McLion писал(а):только есть одна проблемка, не могу закрыть клавиатуру.

Лекс Айрин писал(а): Необходимо нейти Handle окна с заголовком TabTip и послать ему сообщение WM_Close.

Можно и чисто виндовыми средствами: с помощью того же ShellExecute запустить программу tasklist, она выдаст список запущеных процессов. Далее, с помощью функции Pos() найти строку "osk.exe" - это будет строка сведений о запущеной вирт. клавиатуре. Второй столбец после этого названия - ID процесса. Дальше, аналогично запускаем taskkill с номером процесса.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Sharfik » 18.08.2015 04:32:18

Куча людей считают google хорошим поисковиком, хотя от его интерфейса плеваться хочется. В меню сервисов черт ногу сломит. Яндекс всегда был лучше и понятнее, а теперь туда же полез с новым дизайном. Вчера днем мне сказали, что xml формат файлов старый и медленный, а ini типа лучше. Теперь OLE/COM оказались не такими...
ShowMessage("Мир деградирует....");
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Лекс Айрин » 18.08.2015 10:49:18

Vadim, а в виде кода не подскажете?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Vadim » 18.08.2015 11:21:33

Лекс Айрин писал(а): а в виде кода не подскажете?

Так это будет тот же код с Shellexecute. У меня подобная программа работает для администраторов, когда им надо на каком-нибудь клиентском компе принудительно снять задачу. Если не заморачиваться со всякими разными процессами, то примерно так:
Код: Выделить всё
Var
  SDFFile: TSdfDataSet;

Begin
  SDFFIle.Create;
  ShellExecute(0, 'open', 'cmd.exe /C tasklist.exe /V /FO CSV /NH > 1.txt', NIL, NIL, SW_HIDE);
  SDFFile.FileName:='1.txt';
  SDFFile.Open;
  If SDFFile.Locate('field0', Variant('osk.exe', []) Then
    ShellExecute(0, 'open', PChar('cmd.exe /C taskkill.exe /IM '+ff.FieldByName('Field0').AsString), NIL, NIL, SW_HIDE);
//или
    ShellExecute(0, 'open', PChar('cmd.exe /C taskkill.exe /PID '+ff.FieldByName('Field1').AsString), NIL, NIL, SW_HIDE);
End;

Вживую именно эту конструкцию я не проверял, но у меня аналог на работе работает. ;-)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Лекс Айрин » 18.08.2015 11:35:12

Vadim, Я тут немножко пошукал... можно поступить проще.

вот код закрытия программы

Код: Выделить всё
procedure TMainForm.Button2Click(Sender: TObject);
begin

    ShellExecute(0, nil, PChar('taskkill'),PChar('/IM osk.exe'),nil,SW_HIDE);
end;
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Vadim » 18.08.2015 11:44:53

Лекс Айрин
Ну да, действительно. Я как-то выпустил из виду, что речь идёт об одной, совершенно определённой задаче. Вы молодец. :D
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение Лекс Айрин » 18.08.2015 12:29:35

Vadim, я привык проверять опции используемых программ. Еще DOSовская привычка.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Как запустить вирт. клавиатуру в Win7, 8 и 10?

Сообщение McLion » 18.08.2015 20:02:50

Лекс Айрин писал(а):Vadim, Я тут немножко пошукал... можно поступить проще.

вот код закрытия программы

Код: Выделить всё
procedure TMainForm.Button2Click(Sender: TObject);
begin

    ShellExecute(0, nil, PChar('taskkill'),PChar('/IM osk.exe'),nil,SW_HIDE);
end;


Поменял "/IM osk.exe" на "/IM TabTip.exe", но клава не закрывается.
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 231

Рейтинг@Mail.ru
cron