[delphi-users:2451] キーボード制御について

450 views
Skip to first unread message

taronote

unread,
Feb 14, 2012, 6:35:09 PM2/14/12
to delphi...@freeml.com
はじめまして
delphi初心者の木内と申します。

本当に初級の質問で恐縮なのですが、

webアプリ上で入力作業をスタッフにさせているのですが、
そのアプリ上のフィールドで、
「shift + U」で「1」
「shift + I」で「2」
「shift + O」で「3」
「shift + J」で「4」
「shift + K」で「5」
「shift + L」で「6」
「shift + M」で「7」
「shift + ,」で「8」
「shift + .」で「9」
「shift + 9」で「0」
を入力できるようにキー送りを操作するプログラムを
作りたいのですが、どのように作りこめばよいか御教示いただけないでしょうか?

また、全角入力フィールド、半角入力フィールドでも
上記の操作が可能になるようにしたいと思っています。

アドバイスを頂けたら幸いです。

よろしくお願いいたします。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
毎日豪華プレゼントキャンペーン開催中!くまポン
http://ad.freeml.com/cgi-bin/sa.cgi?id=hTlAm
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Feb 15, 2012, 5:31:07 AM2/15/12
to delphi...@freeml.com
[delphi-users:2451] キーボード制御について へのレスです.

こんちには.Mr.XRAYです.

これは,Delphiのプログラムがあって,そこでキー入力するということで
しょうか?
とすると,例えば
shift + U」というキー入力をしたら「1」を,そのWebアプリの入力フィール
ドへ送信なりセットするというような,条件分岐しかないような気がします.

Webアプリの画面上での入力でしたら,JavaScriptで実現できるのかも知れま
せん.


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hTwca
------------------------------------------------------[freeml byGMO]--

taronote

unread,
Feb 15, 2012, 6:51:36 AM2/15/12
to delphi...@freeml.com
Mr.XRAYさま
返答ありがとうございます。

説明不足ですみません。

>これは,Delphiのプログラムがあって,そこでキー入力するということで
しょうか?

入力作業自体はwebアプリ上で行います。
今回ご質問させて頂きました「delphiのプログラム」は
「入力者がshift+U を押したときに1を押されたように見せかける」
ブログラムを今回作りたいと思い、その位置でのプログラムとして考えておりました。

その端末ではwebアプリでの入力作業しか行いませんので
shift+U は必ず「1」が入力されたものとなっても構いません。


>とすると,例えば「shift + U」というキー入力をしたら「1」を,そのWebアプリの入力フィールドへ送信なりセットするというような,条件分岐しかないような気がします.
Webアプリの画面上での入力でしたら,JavaScriptで実現できるのかも知れま
せん.

キーボードマクロなどもいろいろ調べてみました。
「shift+U」をホットキーとしてマクロを作動させ「1」を出力すると定義した場合、
位置フィールドに連続して複数の桁の数字を入力する場合、シフトキーが押しっぱなしになり、うまくマクロが作動しませんでした。
また、入力者の入力スピードにも追従できないようでした。

そのため、delphiでキー操作をエミュレートできればいいなと思いご質問させて頂きました。

JavaScriptでも実現可能かもということで調べてみます。
ただwebアプリはお客様提供のもので我々で触ることが全くできないのですが
それでも可能なのでしょうか。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メンバーで使える掲示板を活用しよう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hTxns
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Feb 15, 2012, 9:38:32 AM2/15/12
to delphi...@freeml.com
[delphi-users:2453] Re: キーボード制御について へのレスです.

>入力作業自体はwebアプリ上で行います。

いまいち,動作仕様が理解できませんが.
キー処理ごとに,Webアプリの入力フィールドに値をセットするということに
なるとちょっと分かりません.
例えば以下の様な考え方はどうでしょうか.
意味を取り違えていたらゴメンなさい.


// 10キーの処理が必要ない場合

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Shift = [ssShift] then begin
if (Key = Ord('U')) or (Key = Ord('u')) then begin
//ここに処理を書く
end;
end;
end;


// 10キーの処理も必要な場合

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
KeyState : TKeyboardState;
begin
if GetKeyboardState(KeyState) then begin
if KeyState[VK_CONTROL] and $80 <> 0 then begin
//$60は10キーの0仮想キーコード
if (Key = Ord('0')) or (Key = $60) then begin
//ここに処理を書く
end;
end;
end;
end;

# [delphi-users:2453]の方のスレッドにレスしました.


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=hTzNU
------------------------------------------------------[freeml byGMO]--

dacho

unread,
Feb 15, 2012, 9:45:18 AM2/15/12
to delphi...@freeml.com
Mr.XRAYさん

グローバルフックのことではないですか?
「delphi グローバルフック」でググるとMr.XRAYさんの
ページが先頭に出てきますが・・・


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hTzUw
------------------------------------------------------[freeml byGMO]--

Mr.XRAY

unread,
Feb 15, 2012, 10:14:33 AM2/15/12
to delphi...@freeml.com
[delphi-users:2456] Re: キーボード制御について へのレスです.

こんにちは.Mr.XRAYです.

>グローバルフックのことではないですか?

あっ,なるほど,

>ホットキーとしてマクロを作動させ

と書いてあったので,もしかしたらとは思ったのですが.
とすると,Webの入力フィールドに入力フォーカスがあるということなの
かも知れません.


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
毎日豪華プレゼントキャンペーン開催中!くまポン
http://ad.freeml.com/cgi-bin/sa.cgi?id=hT0q4
------------------------------------------------------[freeml byGMO]--

carriager

unread,
Feb 15, 2012, 7:02:56 PM2/15/12
to delphi...@freeml.com
こんにちは、carriagerと申します。

DelphiMLの趣旨からは外れるのですが、
taronoteさんのおっしゃる用途の場合、
「AutoHotKey」というソフトが一番向いているのではないでしょうか?

下記のAutoHotKeyスクリプトを実行することで、
目的の動作になるかと思います。

+u::Send,1
+i::Send,2
+o::Send,3
+j::Send,4
+k::Send,5
+l::Send,6
+m::Send,7
+,::Send,8
+.::Send,9
+9::Send,0

--
carriager <c...@qxdr.net>


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
映画「僕達急行 A列車で行こう」試写会にご招待!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hT27B
------------------------------------------------------[freeml byGMO]--

taronote

unread,
Feb 15, 2012, 9:32:38 PM2/15/12
to delphi...@freeml.com
Mr.XRAYさま
dachoさま

>グローバルフックのことではないですか?
「delphi グローバルフック」でググるとMr.XRAYさんのページが先頭に出てきますが・・・

>Webの入力フィールドに入力フォーカスがあるということなのかも知れません.

説明不足ですみませんでした。m(_ _)m
おっしゃるとおりでございまして
入力フィールド上にフォーカスがございます。


Mr.XRAYさまのHP拝見しました。
凄い方からアドバイスを頂いて恐縮しまくりです...。
まさにこれです!


carriagerさま

>DelphiMLの趣旨からは外れるのですが
>「AutoHotKey」というソフトが一番向いているのではないでしょうか?

ありがとうございます。


皆様のアドバイスを元にいろいろ触らせて頂きたいと思います。


つたない説明にも関わらず、
皆様丁寧にアドバイス頂きまして本当にありがとうこざいました。

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
使い方はいろいろ♪一部のメンバーだけにMLメールを送ろう!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hT47T
------------------------------------------------------[freeml byGMO]--

KHE00221

unread,
Feb 16, 2012, 7:10:08 AM2/16/12
to delphi...@freeml.com

とりあえず フック先のところだけ

function LowLevelKeybdProc(nCode:Integer; wParam: WParam; LParam: LParam):
Integer; stdcall;
var
kbdll : PKBDLLHOOKSTRUCT;

function SendKey(VK: Byte): Integer;
begin
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK, 0, 0, 0);
keybd_event(VK, 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_SHIFT, 0, 0, 0);
Result := 1;
end;

begin

if nCode < 0 then
begin
Result := CallNextHookEx (0,nCode,WParam,LParam);
end
else
begin
Result := 0;
if nCode = HC_ACTION then
begin
kbdll := PKBDLLHOOKSTRUCT(LParam);
if (kbdll^.flags) and 128 = 0 then
begin
if ((GetAsyncKeyState(VK_SHIFT) and $8000) <> 0) = True then
begin
//MessageBox (0,PWideChar(IntToStr(kbdll^.vkCode)),'',0);
case kbdll^.vkCode of
Ord('U'):Result := SendKey (Ord('7'));
Ord('I'):Result := SendKey (Ord('8'));
Ord('O'):Result := SendKey (Ord('9'));
Ord('J'):Result := SendKey (Ord('4'));
Ord('K'):Result := SendKey (Ord('5'));
Ord('L'):Result := SendKey (Ord('6'));
Ord('M'):Result := SendKey (Ord('1'));
188:Result := SendKey (Ord('2'));
190:Result := SendKey (Ord('3'));
Ord('9') :Result := SendKey (Ord('0'));
end;
end;
end;
end;
if Result = 0 then Result := CallNextHookEx (0,nCode,WParam,LParam);
end;

end;

Mr.XRAYさん


MLホームページ: http://www.freeml.com/delphi-users

MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=hTDbh
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages