コールバック関数が必要になるので
マシン語やプラグインを使った方が安定した動作になりそうですが、
コールバック用モジュールもあるのでそちらでやってみました。
サブクラス化はコールバック用モジュールのサンプルを参考にしたのでほとんど同じです。
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;
コンボボックスが複数ある場合等には対応していないので、
そこら辺は自由にいじってください。