HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0519
しょぼスクリーンキーボード制御について10未解決


しょぼ

リンク

2015/5/19(Tue) 16:24:12|NO.69292

今、Windowsタブレットで住所管理をするスクリプトを書き始めています。
でも、インプットボックスをタップしたときにスクリーン木ボードが表示され、
フォーカスが失われると消えるようにするためにはどのようにしたらよいのか
わかりません。教えていただければ助かります。
よろしくお願いします。



この記事に返信する


kanamaru

リンク

2015/5/19(Tue) 17:46:48|NO.69293

windows標準スクリーンキーボードを使わなくてもいいなら、
スクリーンIDなどれか(IDとします。)をスクリーンキーボードにして、
inputのウィンドウメッセージを拾えばいいと思います。
流れとしては、
1.inputにカーソルが行く
2.ウィンドウメッセージがシステムから送られる。
3.hspからそれを取得して、あらかじめgsel ID,-1しておいたウィンドウを、
  gsel ID,1で表示する
でもこの方法だとスクリーンキーボードが閉じれないか。
inputからカーソルが移動したときっていうウィンドウメッセージが
あればいいですけど。
ウィンドウメッセージを取得する方法はoncmdという命令をhdlで調べてみてください。
(正直言うと、タブレットにUSBでキーボード接続が一番楽だと思う。)
windows標準スクリーンキーボードが使えればいいですけど。



kanamaru

リンク

2015/5/20(Wed) 08:21:48|NO.69301

調べてみました。
http://hsp.tv/play/pforum.php?mode=pastwch&num=48981
に使えそうなソースがあります。



nora

リンク

2015/5/20(Wed) 17:59:44|NO.69303

win8.1では以下でとりあえず動きました。
でも環境依存が強いので他のバージョンで動くかとか、ましてやタブレットで動くかはわかりません。

//mesboxにフォーカスがあるときにスクリーンキーボードが現れる //inputにフォーカスが移ると消える #include "user32.as" #define WM_SYSCOMMAND $00000112 #define SC_MINIMIZE $0000F020 #define SC_RESTORE $0000F120 sdim s,1000 mesbox s,300,200 hedit=objinfo_hwnd(stat) input a repeat GetFocus if stat==hedit{ gosub *dispkey SetForegroundwindow hwnd }else{ gosub *hidekey } wait 1 loop *dispkey FindWindow "OSKMainClass", 0 if stat==0{ title "キーボード起動中 ちょっと待ってね" exec "osk.exe",16 repeat FindWindow "OSKMainClass", 0 IsWindowVisible stat if stat:break wait 1 loop title "" }else{ FindWindow "OSKMainClass", 0 hkey=stat IsIconic hkey if stat{ SendMessage hkey, WM_SYSCOMMAND, SC_RESTORE, 0 } } return *hidekey FindWindow "OSKMainClass", 0 hkey=stat IsIconic hkey if stat==0{ FindWindow "OSKMainClass", 0 SendMessage hkey, WM_SYSCOMMAND, SC_MINIMIZE, 0 } return



nora

リンク

2015/5/20(Wed) 19:34:14|NO.69304

小さいスクリーンキーボードもあるみたいです。
その場合はこちらで


//mesboxにフォーカスがあるときにスクリーンキーボードが現れる //inputにフォーカスが移ると消える #include "user32.as" #define WM_SYSCOMMAND $00000112 #define SC_CLOSE $0000F060 #define WM_COMMAND $00000111 #define EN_SETFOCUS $00000100 #define EN_KILLFOCUS $00000200 oncmd gosub *oncommand,WM_COMMAND sdim s,1000 mesbox s,300,200 hedit=objinfo_hwnd(stat) input a SetFocus 0 stop *oncommand if lparam==hedit{ switch wparam>>16&0xffff case EN_SETFOCUS gosub *dispkey swbreak case EN_KILLFOCUS gosub *hidekey swbreak swend } return *dispkey exec "C:\\Program Files\\Common Files\\microsoft shared\\ink\\tabtip.exe",16 return *hidekey FindWindow "IPTip_Main_Window", 0 SendMessage stat,WM_SYSCOMMAND,SC_CLOSE, 0 return



スペース(HSP歴3年)

リンク

2015/5/20(Wed) 20:13:23|NO.69305

noraさんのスクリプトは、windows7 Home Premium 64bit、普通のデスクトップpcでは動きませんでした。
実行すると「スクリーンキーボードを起動できません」と表示されます。
このスクリプトだとC:\Windows\SysWOW64にあるosk.exeを開いていますよね。
そこにあることはあるのですが、スタートから「スクリーンキーボード」を検索した場合、
C:\Windows\system32にあるosk.exeを開いてます。

試しにすべてのプログラムから開いた時のスクリーンキーボードのパスを指定してみたのですが、
同じエラーが発生しました。

ただ、スタートからスクリーンキーボードを起動し、inputボックスにフォーカスを移すと、
正常に表示・非表示できます。



kanamaru

リンク

2015/5/21(Thu) 15:32:39|NO.69308

windows標準キーボードでできるのですか!
起動できない原因を説明すると、
リダイレクトによっていろいろとwindowsがいたずらするようです。
kernel32.dllの力でリダイレクトを無効化できます。
何て名前の関数使うか忘れましたが、
調べれば、Wow64DisableWow64FsRedirectionで無効化して、
Wow64RevertWow64FsRedirectionで有効化するとわかります。
使えるサンプルはDelphiですが、
http://mrxray.on.coocan.jp/Delphi/plSamples/640_SoftKeyboard.htm
にあります。



kanamaru

リンク

2015/5/21(Thu) 20:58:19|NO.69310

どうやら先程のサイトをよく読んだらもっと簡単な方法があるようですね。
今スマホから送信してるので、明日にでも
プログラムを作ってみます。



woodfields

リンク

2015/5/23(Sat) 02:52:07|NO.69319

osk.exeが64bit版Windowsでうまく起動できないみたいですね。
noraさんのスクリプトにドロナワ式で追加してみました。

//mesboxにフォーカスがあるときにスクリーンキーボードが現れる //inputにフォーカスが移ると消える #include "user32.as" #define WM_SYSCOMMAND $00000112 #define SC_MINIMIZE $0000F020 #define SC_RESTORE $0000F120 #include "kernel32.as" #const PROCESS_TERMINATE 0x0001 onexit *owari ; 64bit OS かどうか調べる -------------- newcom oWshShell, "WScript.Shell" ProgramFiles_86 = oWshShell("ExpandEnvironmentStrings","%ProgramFiles\(x86\)%") delcom oWshShell if ProgramFiles_86 != "" { if instr(ProgramFiles_86,0,"%") == -1 { flg_64=1 } } ; -------------------------------------- sdim s,1000 mesbox s,300,200 hedit=objinfo(stat,2) input a repeat GetFocus if stat==hedit{ gosub *dispkey SetForegroundwindow hwnd }else{ gosub *hidekey } wait 1 loop *dispkey FindWindow "OSKMainClass", 0 if stat==0{ title "キーボード起動中 ちょっと待ってね" ;exec "osk.exe",16 ; ↑を以下に変更 ----------------------- if flg_64 { exec dir_win+"\\Sysnative\\cmd.exe /C start osk.exe",2 }else{ exec "osk.exe" } ; -------------------------------------- repeat FindWindow "OSKMainClass", 0 IsWindowVisible stat if stat : break wait 1 loop title "" }else{ FindWindow "OSKMainClass", 0 hkey=stat IsIconic hkey if stat{ SendMessage hkey, WM_SYSCOMMAND, SC_RESTORE, 0 } } return *hidekey FindWindow "OSKMainClass", 0 hkey=stat IsIconic hkey if stat==0{ FindWindow "OSKMainClass", 0 SendMessage hkey, WM_SYSCOMMAND, SC_MINIMIZE, 0 } return *owari ; スクリーンキーボードを終了する ----------- FindWindow "OSKMainClass", 0 if stat { hkey=stat pid=0 : GetWindowThreadProcessId hkey,varptr(pid) OpenProcess PROCESS_TERMINATE, 1, pid hProcess=stat if hProcess { TerminateProcess hProcess, 0 stt=stat CloseHandle hProcess } } ; ------------------------------------------ end



woodfields

リンク

2015/5/23(Sat) 20:53:34|NO.69324

NO.69319のスクリプトの修正です。
終わりから6行目の

stt=stat
は無意味です。



スペース(HSP歴3年)

リンク

2015/5/23(Sat) 21:24:21|NO.69325

>>woodfieldsさん
正常に動作しました。



ONION software Copyright 1997-2023(c) All rights reserved.