むりせず♪なまけず? ~ぷろくらすてぃねいたーの言い訳雑記~

よた ときどき .NET  by 刈歩 菜良 CTP

目次

ニュース

C# VB.NET掲示板
C#, VB.NET 掲示板

わんくま同盟
わんくま同盟

Vimエディタ日本語版

iPhone 無料アプリ

あわせて読みたい

日記カテゴリ

書庫

Blog 利用状況

KeyPressの不思議 - BackSpaceが受け取れるのはなぜ?

Windowsフォーム アプリケーションでKeyPressを使うと、文字キーの入力だけつかまえる。
と、いうことにMSDN上はなっています。
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.control.keypress(VS.80).aspx
実際、Deleteキーなどの特殊キーは押してもスルーされます。

が、BackSpaceはKeyPressで捕まえることができてしまいます。

ん?
Delはスルーなのに?BSは捕まえちゃうの?
MSDNには文字キーだけって書いてあるのに?

いろいろ調べたら、こんなのも見つけました。
「KeyPressEventArgs.KeyChar プロパティ  」
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.keypresseventargs.keychar(VS.80).aspx

ここにはこうあります。

====引用スタート
次のキーを取得または設定できます。
・a ~ z、A ~ Z の各キー
・Ctrl キー
・区切り記号
・数字キー (キーボード上段のキーとテンキーの両方)
・Enter キー

次のキーは取得または設定できません。
・Tab キー
・Ins キーと Del キー
・Home キー
・End キー
・PageUp キーと PageDown キー
・F1 ~ F2 の各キー
・Alt キー
・方向キー
====引用終わり

おぉ、すごい細かく書いてある。
ってか、BackSpaceは??

ん?Ctrlが取れるとですか!?
やっぱ、取れへんがなぁ。

こんなんFAQだと思ってすぐ分かると高をくくって調べてみましたが、結局わからん。

BackSpaceは文字キー扱いで、Delキーが特殊キー扱いってのはOS側の仕様なのかしら?

でもなぢぇ?
ヽ(。_゜)ノ

最初は掲示板に書こうとしていたけど、書いてるうちにBlogのノリになってきたので、急遽Blogにしてみました。(^^ゞ

投稿日時 : 2007年5月15日 14:45

Feedback

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/15 14:49 刈歩 菜良

> 高をくくって
takaをくくって
えーーーーーーーーーー

ごめんなさいごめんなさいごめんなさい
ボケがない文面に耐えられませんでした。
<(_ _)>

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/15 15:20 黒龍

BackSpaceは歴史が長いからじゃなかったでしたっけ?
ま、コントロールコードは悩まないようにIsInputKeyするということで。
適当ですんません。

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/15 15:29 HiJun

Dellはパソコンメーカーじゃけー
という突っ込みは置いといて。
確かに[BS]も[DEL]もAsciiコードに
あったような気が...

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/15 15:41 刈歩 菜良

早速のコメントありがとうございます。

黒龍さん
やっぱ、一番ありそうなのは歴史的背景ですよね。

HiJunさん
> Dellはパソコンメーカーじゃけー
わたしも自分で書いたとき一瞬そう勘違いして、編集しようとしたんですよ。
でも、よ~くみると、「Del」のlと「は」の左の縦棒がlに見えてるだけでした。
(^O^)

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/15 15:41 ぽぴ王子

   ||
 ∧||∧ ← <del>taka</del>高
( / ⌒ヽ
 | |   |
 ∪ / ノ
  | ||
  ∪∪
   ;
 -━━-

テラヒドスwwww

> BackSpaceは文字キー扱いで、Delキーが特殊キー扱いってのはOS側の仕様なのかしら?

僕もそんな詳しいわけじゃないですが。

WIN32API の TranslateMessageによれば。

> TranslateMessage 関数は、キーボードドライバが ASCII 文字を割り当ててい
> るキーに対してのみ、WM_CHAR メッセージを生成します。

つーことは、ASCII 文字が割り当てられていないキーに対しては WM_CHAR メッセージ
いわゆる KeyPress (イコールじゃないかもしれないけど)が送られると。
で。
BackSpace は 0x08 のコードが割り当てられているから…というのはどうでしょうか。
Delete は 0x7F が(一応)割り当てられてはいるのだけど、それは無視されてるとか。
厳密には ASCII とは言えないような気もしますが>0x7F

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/15 15:44 ぽぴ王子

間違えた。
ASCII 文字が割り当てられているキーに対しては、だった orz

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/15 15:46 Ognac

根拠がないのですが...
汎用機のシステムコンソールでタイプライターのBSは印字位置を1文字戻すが、ログストリームはchr(8) を付加した状態で保持するという仕様だった記憶があります。その名残かどうかは不明ですが、その当時の互換性維持でないかと想像します.....推察の範囲をでませんが。

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 9:21 刈歩 菜良

ぽぴ玉子
> WIN32API の TranslateMessageによれば。
> ・・・
なるほどぉ~。
TranslateMessageってやつが黒幕ですね。

Ognacさん
> ログストリームはchr(8) を付加した状態で保持するという仕様
おぉ!
ストリームの仕様なのですね。
そういえば、あふぉなTermとかはパスワードうち間違えてBSで修正しようとしてもだめでしたね。

具体的な状況も含めてOgnacさんの例が一番説明付きそうですね。

みなさま、ありがとうございます!!
(●^o^●)/

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 11:09 ぽぴ王子

納得いかない(ウソ)王子が検証してみましたよ。

たまたま手元に TextBox を継承したクラスがあったもんで、それの WndProc を
オーバーライドして、WM_KEYDOWN と WM_CHAR メッセージを監視してみた。
すると、BackSpace キーの場合は WM_KEYDOWN→WM_CHAR と届くのに対して
Delete キーは WM_KEYDOWN しか来ていなかったと。

ということは、やはり TranslateMessage で Delete キーがキャラクタにマップ
されていないから KeyPress イベントが上がらないという結論で良さそうです。

ちなみに Term で BS で修正してもダメなのはまた別な理由なのだけど割愛。

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 12:44 刈歩 菜良

> 納得いかない(ウソ)王子が検証してみましたよ。
(/。\)キャー。
お手柔らかに―。
# でも、ぽぴっちの案を否定していたわけではないのよ。

ってか、検証ありがとう!!
なるほど、これでOS側の大人の事情が原因ってことがハッキリカッキリスッキリズバッとわかりました。

んで、それで納得してくれへんのが<DEL>頑固な</DEL>志の高い向学心あふれた受講生の方々ですよ。
# あ、てか、実際に対応を今現在求められてるわけでも何でもないですよ。

「仕組みはわかったけど、なんでそう言う仕様なん?>OS」ってな流れになるんよねぇ。

そうなると一文字単位の受け渡しを想像すると、BSは文字として受け取った方が処理が簡単。DELは使う前に必ずカーソル移動が伴うから、一文字単位の処理としては対応しきれんから文字としては受け取らん。という理屈が(本当かどうかは別として)一番受けいられやすいかなぁ。と...
わたくしもあくまでも想像なのですが...

ここら辺の歴史に詳しい偉い人、誰か教えてニムカ?

> ちなみに Term で BS で修正してもダメなのはまた別な理由なのだけど割愛。
気になるー大柴

# たまにはおやぢギャグも良いかと思って...
# 魔が差しました... <(_ _)>

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 14:33 とっちゃん

えー。。。歴史的経緯ですね...はいはい。
歴史書を見るとですね...

まずは Ognac さんの書いた
>汎用機のシステムコンソールでタイプライターのBSは印字位置を1文字戻すが、ログストリームはchr(8) を付加した状態で保持するという仕様だった

ここが原点になるようです。
ですが、残念ながらおいらの歴史書は、CP-M の時代より後の近代史以降なので、ちゃんと書かれてないですねw
もっと古い歴史書を持ってる人に当たらないとwww




えーっと、ちゃんとした答えw

ASCII 文字コードの規格書に書かれてたはずですが
原点は Ognac さんが書かれてるとおりです。

でもって、TranslateMessage のネタは...
MS-DOS の頃からそうだったからw
で、MS-DOS は、CP-M がそうだったからw
で、CP-M はメインフレームがそうだったからw
が理由です。

大人の事情です。突っ込んではいけません。
もちろん、子供(初心者/初学者)が知る必要はねーですwww

Term で BS は、echo でよろしくってことでwww

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 14:40 ぽぴ王子

> # でも、ぽぴっちの案を否定していたわけではないのよ。

それはがってん承知の助なのだけど、僕の説は本当に正しいのか?と自分で
気になったからなのでした。
詳しくないからさ~、とか言い訳して曖昧な情報を書いちゃったらマズいかな
とか思って。
かるぼさんとタイマン(違)で話しているのならばそれでも後でフォローできる
けれど、こういうところだと皆さん見ているわけなので。キャッ(何

とは言え、僕の検証も自分で納得したいがためなので、本当はできればもっと
詳しい人たちに解説していただきたいのは同じであります。
お茶の偉い人とか、インストーラの偉い人とか、キングスライムの偉い人とか。

> > ちなみに Term で BS で修正してもダメなのはまた別な理由なのだけど割愛。
> 気になるー大柴

これは、たぶん
Term から BS を送信→サーバが BS をエコーバック→ BS は1文字戻るだけ
という処理になっているからなんじゃないか…とか。
エロいサーバは BS を単にエコーバックするだけじゃなくて、BS + 空白 + BS
と変換して送信してくるんじゃないかと思って三田寛子。

この辺も偉い人に解説していただきたい…おねがい(マイメロディ風に)

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 14:41 ぽぴ王子

って書いてたらすでにチョ→偉い人が!!!1!!

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 15:01 刈歩 菜良

とっちゃん
ありがとーーー!!
なるほどなるほど。
汎用機までさかのぼっちゃうんですねぇ。
おこちゃまなわたくしはおぼれる前に足を洗おう。
(^.^)

> かるぼさんとタイマン
よっしっ!
望むところだぁっ!!
岡村ちゃんでも筋少でも何でもこいっ!
# って、違っ。
# でも、実現希望。(^・^)

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 15:01 刈歩 菜良

そいえば、
ずいぶんと長いこととっちゃんとオフでお会いしてないなぁ...

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 15:57 とっちゃん

>ずいぶんと長いこと
まだ、ほんの数か月...くらい?w
おいらがあってない気がしないのはビデオ見てるからだな。
芸能人と一緒だwww

>おこちゃまなわたくし
若造のおいらは大人の事情は知らない(知ってても知らないww)ので、あれ以上は書けねーですw

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 17:56 刈歩 菜良

> 知ってても知らないww
えー。
気になルールルルル。

では、今度オフのときにでも
(^.^)

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 19:39 とっちゃん

>今度オフのときにでも
おいらの解禁予定は7月だしw
#6月は危険臭が漂っておりまする...orz

爺衆に聞くのがよいかとww

MS-DOS と CP-M の間の存在も話してくれるよww
うまくそこに誘導できれば...w

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 22:15 Ognac

>MS-DOS と CP-M の間の存在も話してくれるよ
ひょっとして知らない世代?
>爺衆に聞くのがよいかとww
わても爺衆なの.....orz

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/16 22:38 とっちゃん

>ひょっとして知らない世代?
一応30代ですからwww

当時は...中学生になったくらいじゃないかな?
なので、リアルタイム世代じゃないですよw
当時のおいらは、8ビットマンセーだったしww
#CP-M は8bit焼きなおし版なら触ったことがありますw<かなり爺w

ちなみにおいらとひろえむさんはすでに爺衆に分類されとります。
単に始めたのが早かっただけのはず...なんですがw
要は年齢ではないとw
#どこまで古いネタについていけるかで確定するですwww

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/17 0:37 Ognac

>どこまで古いネタについていけるかで確定するですwww
TK-80世代で, TRS/AppleⅠに憧れていた私は曾爺衆かwwww.

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/17 15:17 刈歩 菜良

> MS-DOS と CP-M の間の存在も話してくれるよww
えっと、CP-Mってなんぢゃろ?
ウィッキーさんに聞いてみました。
ふぅーんOSなんだぁ。

といいつつ、わたくしが何衆に分類されるかはオンでは内緒。
(^.^)

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/17 18:38 とっちゃん

>TK-80世代で
この辺は普通の爺衆ですな。まだ、曾爺 にはならねーですよw

MZとか、N-BASICとかで、遜色なく付いてこれるかどうかが爺の境目ですw
そこから先は...自己申告でwww

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/18 17:35 ぽぴ王子

ひろえむさんやとっちゃんと話していると自分がどこに位置するのか
わからなくなる王子が来ましたよ。

MZやN-BASICとかJR-100とか消しゴムキーボードとか、グリーンディス
プレイとか巨大電卓FP-1100とか、その辺はだいたい押さえてるつもり
なのだけど、二人と話すともっと濃ゆい話ばっかりになるので、とても
若造に思えます(ぉ
僕なんか所詮「じゃんけんポン、カセットポン!」世代ですから :-)

TRS-80とかも触ったことはあります。中学の先生が持ってたんで。
APPLE][も…KARATEKAは名作だ!!とか言ってみます。

CP/Mも使ったことはある…はず…でもあんまり記憶にないですね。

曾爺レベルって誰でしょう。わんくまで言うとえ○○ウさん?(バレバレ

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/19 17:38 とっちゃん

素朴な疑問...
「CP-M」になぜ突っ込みが入らない...orz
#しょっぱなはマジに間違ってたがw

2回目からはわざわざ間違って書いてるのに...

>曾爺レベル
名乗ったらじゃねーですか?

おいらは若造だからよくわからねーですwww

# re: KeyPressの不思議 - BackSpaceが受け取れるのはなぜ? 2007/05/20 21:51 刈歩 菜良

> 「CP-M」になぜ突っ込みが入らない...orz
> #しょっぱなはマジに間違ってたがw
> 2回目からはわざわざ間違って書いてるのに...
えぇーーー
たしかにういっきーさんに聞いたらCP/Mで出てきたけど。
とっちゃんがそう書けばそうも書くんだろうなぁって思うやないのぉ~。

タイトル  
名前  
Url
コメント