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


HSPTV!掲示板


未解決 解決 停止 削除要請

2024
0516
taroキーフックでのENTERキーについて15解決


taro

リンク

2024/5/16(Thu) 21:39:38|NO.101718

今、modclbk3.hspでキーフックを組んでいます。
そこで全角変換時のEnterキーも改行のEnterキーも同じキーコード13で検知されます。
これを見分けて処理したいのですが、色々試しのですができません。
どなたか、見分ける方法を御教示いただけませんか。
よろしくお願いします。



この記事に返信する


nennneko5787

リンク

2024/5/19(Sun) 09:15:15|NO.101719

できないとおもいます



taro

リンク

2024/5/19(Sun) 14:19:49|NO.101720

nennneko5787さん、ありがとうございます。
やっぱりそうですか。
IME関係の変換中とか検知してやってみたのですがダメだったんですよね。
何かほかに方法があるかとこのスレをたてました。
もう少し他の方のお知恵を待ちたいと思います。
よろしくお願いします。



窓月らら

リンク

2024/5/19(Sun) 16:54:07|NO.101721

すみません、ねんねこさんが出来ないと言ったのはたぶんうちのせいなんでw
他所でちょっとネタにしていたら難しいみたいな事をうちが書いたせいです。たぶん。

でももしかしたらこれじゃないかなって。
HSPに同梱されているサンプル onkey.hsp を見てください。
これがヒントにならないでしょうか。

(キーロガーを作ろうとしてるのかなーとちょっと思ってしまったのですが。



さか2

リンク

2024/5/19(Sun) 20:54:07|NO.101722

かなり前ですが、これを使わせてもらって入力補完ツール作ったことあります。
今、そのまま使えるか試してないですが。
https://tu3.jp/0524



taro

リンク

2024/5/20(Mon) 14:55:09|NO.101724

窓月ららさん、さか2さん、ありがとうございます。
自作の多機能?エディタに、自前のアンドゥ、リドゥ機能を装備してたんですが、
ここにきてバグが見つかり、修正にあがいています。
つーささんのkeyhook.dllは基本は同じだと思いますが、テストしてみます。



usagi

リンク

2024/5/20(Mon) 18:08:04|NO.101725

こんにちわ
wparamだとVK_PROCESSKEY(0xE5)がポストされると思いますので、
キーボード直であるスキャンコードからバーチャルキーコードに変換すれば良いのではと思いました。


#uselib "imm32.dll" #cfunc ImmGetContext "ImmGetContext" int #cfunc ImmGetOpenStatus "ImmGetOpenStatus" int #func ImmReleaseContext "ImmReleaseContext" int,int #uselib "User32.dll" #cfunc MapVirtualKey "MapVirtualKeyA" int,int ; キー割り込み onkey gosub *ON_KEY mes "半角/全角キーを切り替えて入力して" stop ; キー入力 *ON_KEY if ginfo_cy > ginfo_sy : cls ; IMEが起動しているか取得 himc = ImmGetContext(hwnd) ime = ImmGetOpenStatus(himc) ImmReleaseContext hwnd, himc ; スキャンコードを取得 sc = (lparam>>16)&$ff ; バーチャルキーコードに変換 vk = MapVirtualKey(sc,1) if ime { mes strf("キーコード(IME中):%d", vk) } else { mes strf("キーコード: %d", vk) } return

私自身の後学の為、もし可能であれば
「IME関係の変換中とか検知してやってみたのですがダメ」の
どうダメだったかの内容を教えて頂けると大変ありがたいです。



taro

リンク

2024/5/20(Mon) 18:38:05|NO.101726

usagiさん、ありがとうございます。

>私自身の後学の為、もし可能であれば
>「IME関係の変換中とか検知してやってみたのですがダメ」の
>どうダメだったかの内容を教えて頂けると大変ありがたいです。

http://hsp.tv/play/pforum.php?mode=all&num=4533
のIrisawaさんのマシン語を使ったもの、modclbk3.hspでサブクラス化したもの両方で
試したのですがうまくいかず、更にRichEditerをベースに作っているのですが、両方とも
変換文字列が変な窓がでてきて変換するので断念しました。

usagiさんのもの試してみます。



taro

リンク

2024/5/20(Mon) 20:15:48|NO.101727

usagiさん、残念ながらこの方法は試し済みでした。
全角変換モードなら、変換のEnterも改行のEnterもひっかかります。
上記を実行しても同様です。



usagi

リンク

2024/5/20(Mon) 21:34:17|NO.101728

説明ありがとうございます。 あら、ダメでしたか。。。
「ひっかかる」というのが理解できていなく、
RichEditerではなく、ウインドウ直ですが、こういうイメージですか?

#uselib "imm32.dll" #uselib "User32.dll" #cfunc MapVirtualKey "MapVirtualKeyA" int,int #define VK_RETURN 0x0D ; キー割り込み onkey gosub *ON_KEY oncmd gosub *ON_IME_ST, 0x010D oncmd gosub *ON_IME_ED, 0x010E stop ; キー入力 *ON_KEY if ginfo_cy > ginfo_sy : cls ; スキャンコードを取得 sc = (lparam>>16)&$ff ; バーチャルキーコードに変換 vk = MapVirtualKey(sc,1) if vk = VK_RETURN { if ime = 0 : mes "改行" if ime = 1 : mes "IME確定" } return *ON_IME_ST ime = 1 return *ON_IME_ED ime = 0 return



taro

リンク

2024/5/20(Mon) 22:25:56|NO.101729

usagiさん、ありがとうございます。
imeの変換中って、サブクラス化しなくてもこんなに簡単にできるんですね。
このように、フラグで管理するようにすると私のしたい事はできます。
私の環境でしょうか?
usagiさんのPCでは出ませんか?
変換モードにして、変換文字を入力すると、勝手にinputのような入力バーみたいなものが
出て、そこに入力文字が表示され、確定するとウィンドウに確定文字が表示されます。
Irisawaさんのマシン語を使用して、mesboxでテストした時普通にできましたが、Richでやると
この変換窓が出るので、Rich特有の現象かと思ったのです。
この現象はmodclbk3.hspでサブクラス化してもでるんです。
で、諦めました。
二者択一になるのかな?



usagi

リンク

2024/5/21(Tue) 01:24:04|NO.101730

もろもろ返信です。

>サブクラス化しなくてもこんなに簡単に
別のウインドウオブジェクトにメッセージ処理を委託しないのであれば、
"oncmd"でIMEのメッセージを処理するだけなので簡単にできますよ。
※例として私のサンプルだとmesboxでのimeの状態は取得できません。

>このように、フラグで管理するようにすると私のしたい事はできます。
Enterはキーの入力でしかないので、IMEの状態を管理する必要があるかと考えてます。
何かしらの理由でフラグ管理を避けたいのであれば、申し訳ございませんが私にはお手上げでございます。。。

>勝手にinputのような入力バーみたいなものが
あーなるほど、IMEのコンポジションウインドウが気になる感じなんですかねぇ。。。
試しにですが、

#uselib "imm32.dll" #cfunc ImmGetContext "ImmGetContext" int #func ImmReleaseContext "ImmReleaseContext" int,int #func ImmSetCompositionWindow "ImmSetCompositionWindow" int, var #func ImmSetCompositionFont "ImmSetCompositionFontA" int,int #define CFS_DEFAULT 0x0000 #define CFS_POINT 0x0002 #uselib "User32.dll" #cfunc MapVirtualKey "MapVirtualKeyA" int,int #define VK_RETURN 0x0D ; キー割り込み onkey gosub *ON_KEY oncmd gosub *ON_IME_ST, 0x010D oncmd gosub *ON_IME_ED, 0x010E stop ; キー入力 *ON_KEY if ginfo_cy > ginfo_sy : cls ; スキャンコードを取得 sc = (lparam>>16)&$ff ; バーチャルキーコードに変換 vk = MapVirtualKey(sc,1) if vk = VK_RETURN { if ime = 0 : mes "改行" if ime = 1 : mes "IME確定" } return *ON_IME_ST ime = 1 himc = ImmGetContext(hwnd) mref bmscr, 67 ImmSetCompositionFont himc, bmscr.49 x = ginfo_cx : y = ginfo_cy CompForm = CFS_POINT, x , y ,0,0,0,0 ;↓このコメントを消すと「inputのような入力バーみたいなもの」という物が出る? ;CompForm = CFS_DEFAULT, x , y ,0,0,0,0 ImmSetCompositionWindow himc, CompForm ImmReleaseContext hwnd, himc return *ON_IME_ED ime = 0 return

>Richでやるとこの変換窓が出る
ちなみにRichとはどの様なものですか?(winobj "RICHEDIT"... で作成したもの?)



usagi

リンク

2024/5/21(Tue) 08:53:33|NO.101731

一応ですが、NO.101730 の”試し”が仰られている症状なのであれば、
以下サンプルのようにするとRichで「勝手にinputのような入力バーみたいなものが」と言われるものが消えませんか?

#include "modclbk3.hsp" #include "kernel32.as" #include "user32.as" ; リッチエディット LoadLibrary "Msftedit.DLL" winobj "RICHEDIT50W", "hoge", 0, 0x50b00004/*WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|ES_MULTILINE*/, ginfo_winx, ginfo_winy hwnd_edit = objinfo_hwnd(stat) : SetFocus hwnd_edit ; キャラクタフォーマット(仮で文字を赤くしとく) chara_format2 = 84, 0x40000000/*CFM_COLOR*/, 0, 0, 0, 0x0000FF/*BBGGRR*/ sendmsg hwnd_edit, 0x444/*EM_SETCHARFORMAT*/, 0x4/*SCF_ALL*/, varptr(chara_format2) ; コールバックとサブクラス化 cbl = *CB : newclbk3 pcbl, 4, cbl def_edit_proc = GetWindowLong(hwnd_edit, $FFFFFFFC/*GWL_WNDPROC*/) SetWindowLong hwnd_edit, $FFFFFFFC/*GWL_WNDPROC*/, pcbl stop *CB dupptr msg, lparam, wparam*4, 4; WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) switch msg.1 case 0x0100 /*WM_KEYDOWN*/ vk = MapVirtualKey((msg.3>>16)&$ff,1) if vk = 0x0D/*VK_RETURN*/ { if ime = 0 : title "改行" if ime = 1 : title "IME確定" } swbreak case 0x010D /*WM_IME_STARTCOMPOSITION*/ ime = 1 swbreak case 0x010E /*WM_IME_ENDCOMPOSITION*/ ime = 0 swbreak default swbreak swend CallWindowProc def_edit_proc, msg.0, msg.1, msg.2, msg.3 return stat
もし、そうであればIMEのメッセージ処理をRichのプロシージャに任せるのではなく、
デフォルトウインドウプロシージャに任せているのでは?と思われました。

ですから、Irisawaさんのマシン語とmodclbk3.hspとは直接関係ない問題かと考えられまして、
解説したいのですが、どちらもマシン語使っており元のソースが分からない為、
逆アセンブルしないと実装の実態は分からず、かなり骨が折れそうなので私には説明が難しいです。

状況があまり理解できておらず、当てずっぽうで申し訳ないです。。。
IMEの状態のフラグ管理はしてしまいますが、掲題のEnterの見分けはおそらく出来ていると思いますので、
この辺りで失礼いたします。



taro

リンク

2024/5/21(Tue) 12:38:03|NO.101732

usagiさん、感謝!感謝!です。
ありがとうございます。

言葉足らずで申し訳ありません。

仰る通り、私もフラグ管理しかないと思っています。

NO.101730のスプクリトでは、何故か全角変換モードで入力しようとすると
>ImmSetCompositionFont himc, bmscr.49
がシステムエラーになって落ちます。
私が見たところ間違いないと思うのですが、何故通らない原因不明です。

>ちなみにRichとはどの様なものですか?(winobj "RICHEDIT"... で作成したもの?)
CreateWindowExで生成しています。

NO.101731のスプクリトで、変な入力バーが出ずに変換できて、フラグ管理できています。

>もし、そうであればIMEのメッセージ処理をRichのプロシージャに任せるのではなく、
>デフォルトウインドウプロシージャに任せているのでは?と思われました。

このスクリプトを元に、見直してみます。

結果は見直してからご報告させていただきます。



usagi

リンク

2024/5/21(Tue) 14:37:07|NO.101733

あ、すみません。NO.101730のスプクリトはIMEのフォントを合わせる必要はないので、
"ImmSetCompositionFont"の行コメントアウトして頂いて大丈夫です。
※もしくは手前で一度"font"すればイケるかも(フォントってbmscr.49じゃなかったかなぁ。。バージョンで違うかも)

NO.101731で変な入力バーが出ないとの事で安心しました。

>CreateWindowExで生成しています。
それであればWinobjと同じ様なものなので大丈夫そうですね。
リッチエディットのバージョンに関しては念の為Ver.1〜4試しましたがどれも動作したので、
おそらくお使いのリッチエディットでも問題ないと考えてます。
※詳細※
https://learn.microsoft.com/ja-jp/windows/win32/controls/about-rich-edit-controls



taro

リンク

2024/5/21(Tue) 21:07:55|NO.101734

usagiさん、本当にありがとうございました。

RichEditerのフォント設定周りをチェックしましたが不審な記述無。
で、色々調べていると、usagiさんの予想通り、コールバック関数で
変換開始と終了を検知した時、何を考えていたのか、
デフォルトのプロシージャ(DefWindowProc)を呼んで
リターンしていたのが敗因でした。
正しく元のプロシージャ(CallWindowProc)を呼びだしてリターンすると
現象が止まりました。
Irisawaさんのマシン語を使ったものは当然ですが不明です。

RichEditerのライブラリはMsftedit.dllを使っています。
他のライブラリもチェックしてくだされたとの事、お手を煩わし恐縮でした。

皆さんのおかげで無事解決しました。
改めて深く深謝します。m(__)m



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.101718への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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