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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0311
comboxの検索について3解決


リンク

2018/3/11(Sun) 19:01:21|NO.82719

今更ながら、打鍵音を好きな音に変えるソフトを作っています。
comboxにてファイル名一覧からファイル選択する際に、
comboxがフォーカスされているとファイル名が検索される機能
(cを押すと頭文字がcのファイルに順番にジャンプする)
を殺す方法は無いでしょうか?



この記事に返信する


いののて

リンク

2018/3/12(Mon) 13:17:20|NO.82724

自分が調べた限りでは、コンボボックスにはキー操作を無効にする機能は無いので、
サブクラス化をして、コンボボックスのWM_KEYDOWN、WM_CHARメッセージを乗っ取るしかないようです。



あまら

リンク

2018/3/12(Mon) 18:02:55|NO.82728

コールバック関数が必要になるので
マシン語やプラグインを使った方が安定した動作になりそうですが、
コールバック用モジュールもあるのでそちらでやってみました。
サブクラス化はコールバック用モジュールのサンプルを参考にしたのでほとんど同じです。


20行目あたりのコメントアウトしてある所を使うと少しだけ動作が変わります。

36〜38行目、42行目の終了時処理の箇所は、あくまでも念のために入れたものですが
これが無いと終了後にプロシージャが残って(?)画面がチラついたり、
デバッグウィンドウが閉じなかったりするので入れておいた方が無難です。


#include "modclbk3.hsp" // コールバック関数用モジュール #uselib "user32.dll" #cfunc global CallWindowProc "CallWindowProcA" int, int, int, int, int #cfunc global DefWindowProc "DefWindowProcA" int, int, int, int #define global GetWindowLong GetWindowLongA #cfunc global GetWindowLongA "GetWindowLongA" int, int #define global SetWindowLong SetWindowLongA #func global SetWindowLongA "SetWindowLongA" int, int, int #define global GWL_WNDPROC -4 // ウィンドウプロシージャのアドレス #define global WM_KEYDOWN 0x0100 // 非システムキーが押された #define global WM_CHAR 0x0102 // キーボードからの文字の入力 #module // コールバック *cb_callback dupptr msg, lparam, wparam*4, 4; // 文字入力は無視するが、カーソルキー等は許可する場合 /* if( msg(1) == WM_CHAR ) { // 文字入力された場合は何もしないで戻る return DefWindowProc(msg(0), msg(1), msg(2), msg(3)); }*/ // キー入力を全て無視する場合 if( (msg(1) == WM_KEYDOWN) || (msg(1) == WM_CHAR) ) { // キーが押された場合は何もしないで戻る return DefWindowProc(msg(0), msg(1), msg(2), msg(3)); } // キー入力以外は通常通り rc = CallWindowProc(oldproc, msg(0), msg(1), msg(2), msg(3)); return rc; // 念のため終了時にプロシージャを戻す *when_end SetWindowLong cbhwnd, GWL_WNDPROC, oldproc; // ウィンドウプロシージャを戻す end; // コンボボックスをキーフック化する #deffunc hook_combox int phwnd onexit goto *when_end; cbhwnd = phwnd; combox_clbk = *cb_callback; newclbk3 newproc, 4, combox_clbk; oldproc = GetWindowLong(phwnd, GWL_WNDPROC); // ウィンドウプロシージャのアドレス取得 SetWindowLong phwnd, GWL_WNDPROC, newproc; // ウィンドウプロシージャの書き換え return; #global onkey gosub *keydown; list = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\nA\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\nL\nM\nN\nO\nP\nQ\nR\nS\nT\nU\nV\nW\nX\nY\nZ"; combox cbidx, 100, list; cbid = stat; cbhwnd = objinfo(cbid, 2); // コンボボックスのウィンドウハンドル取得 hook_combox cbhwnd; // コンボボックスをキーフック化する stop; *keydown redraw 0; color 255, 255, 255:boxf; color 0, 0, 0:pos 100, 100; mes "文字コード:"+iparam+"が押された。"; redraw 1; return;

コンボボックスが複数ある場合等には対応していないので、
そこら辺は自由にいじってください。



リンク

2018/3/12(Mon) 23:10:50|NO.82737

ご回答感謝です。
win32api関連はさっぱりで、ハンドルやらメッセージやら入ってくると
手に負えません。
インターフェースを工夫してみて対応しようかと思います。
サンプルまでご提示いただき有難うございました。



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