5/27 回答が連続投稿される不具合が発生しております

VisualStudio 2010 C# form アプリケーションです。

テキストボックスの内容(キーワード)で検索するプログラムを作りました。リターンキーを押す度に候補に順にスクロールします。

KeyDown イベントでe.KeyCode == Keys.Return でリターンキーを拾っています。

ところでIME で漢字入力中に確定でリターンキーが押されますが、それだと変換途中の場合もある訳です。もちろんIME のボックスでのリターンキーですから、テキストボックスには飛んでこないと思っていたのですが・・・どうやらリターンキーが押されたという事でイベントが発生してしまいます。

変換途中でのリターンキーには反応させたくないのです。なにか手がありますか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

ヒント:

http://msdn.microsoft.com/ja-jp/library/system.w …
困ったときには、MSのページくらいは探した方がいいと思います。

参考URL:http://msdn.microsoft.com/ja-jp/library/system.w …
    • good
    • 0
この回答へのお礼

ありがとうございます。

安易に回答を求めて質問してしまったのを後悔しています。やはりよく調べてから質問するべきでした。つい時間を惜しんで・・・。

改めて調査したところ、上記の動作は別の要因でした。IME での変換中のリターン押しは、テキストボックスのkeydown イベントには届いていませんでした。おかしいなぁと思っていたんです。

お礼日時:2011/05/19 14:51

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVB.NET DataGridView 縦スクロールバーを常に表示

VB.netについてなのですが、
DataGridViewの縦スクロールバーを常に表示したいです。
データ数によってスクロールバーが表示されたり非表示になったりしていますが、常に表示することは可能でしょうか。教えてください。

環境:
Visualstudio2005
windows XP
よろしくお願いします。

Aベストアンサー

Private vsBar As VScrollBar
Private Sub DataGridViewScrollBar_Load(ByVal sender As Object, ByVal e As EventArgs)
Me.tESTTableAdapter.Fill(Me.testdbDataSet.TEST)

For Each c As Control In dataGridView1.Controls
If TypeOf c Is VScrollBar Then
vsBar = DirectCast(c, VScrollBar)

AddHandler vsBar.VisibleChanged, AddressOf vsBar_VisibleChanged
End If
Next
End Sub
Private Sub vsBar_VisibleChanged(ByVal sender As Object, ByVal e As EventArgs)
If Not vsBar.Visible Then
'縦クロースバーを常に表示する。
Dim borderWidth As Integer = 2

vsBar.Location = New Point(Me.dataGridView1.ClientRectangle.Width - vsBar.Width, 0)
vsBar.Size = New Size(vsBar.Width, Me.dataGridView1.ClientRectangle.Height - borderWidth)
vsBar.Show()
End If
End Sub

ミスしてたらごめんなさい・・・orz

Private vsBar As VScrollBar
Private Sub DataGridViewScrollBar_Load(ByVal sender As Object, ByVal e As EventArgs)
Me.tESTTableAdapter.Fill(Me.testdbDataSet.TEST)

For Each c As Control In dataGridView1.Controls
If TypeOf c Is VScrollBar Then
vsBar = DirectCast(c, VScrollBar)

AddHandler vsBar.VisibleChanged, AddressOf vsBar_VisibleChanged
End If
Next
End Sub
Private Sub vsBar_VisibleChanged(ByVal ...続きを読む

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QAPI関数ImmSetConversionStatus のビットセット

API関数ImmSetConversionStatus のビットセットを組み合わせて、IME2003の「直接入力」モードに
設定することは可能でしょうか?いろいろ試してみたのですが、うまくいかないので質問しました。ご存知の方がおられましたら、よろしくお願いします。

Vista
エクセル2007 VBA

Aベストアンサー

IMEのOFFを、エクセルのシートで利用するのでしょうか?フォームで利用するのでしょうか?

わからなかったので、シートでのIME制御例として説明しています。
ってかシートであれば、APIを利用しないでも出来てしまいますが^^;;

一応余談として、最後に載せてます。

プログラミングとしては、以下の3工程を行ってください。


------------------------------------
※1.み~くんパパの仕事部屋(旧)より
http://www.mitene.or.jp/~sugisita/vb6_ime.html

「IMEのON/OFF」
を解凍

------------------------------------
※2.解凍した中から標準モジュール2本
・mIMM
・mWin32API
をエクセルのプロジェクトに追加


------------------------------------
※3.ワークシートのマクロとして以下のコードをコピペ
Sheet1のマクロにこれを張ると、セルを移動するたびにIMEの状態が切り替わります。
フォームに張るのであれば、カスタマイズしてください。

Option Explicit

Private Declare Function GetActiveWindow Lib "USER32" () As Long

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  Dim hwndIME As Long
  Dim hIMC  As Long
  Dim blnIME As Long
  
  Dim l_hWnd As Long
  l_hWnd = GetActiveWindow()
  
  ' IMEのデフォルトウィンドウの取得
  hwndIME = ImmGetDefaultIMEWnd(l_hWnd)
  If hwndIME Then
    ' IMEコンテキストの取得
    hIMC = ImmGetContext(hwndIME)
    If hIMC Then
      ' 現在のIMEのON/OFF状態を取得
      blnIME = ImmGetOpenStatus(hIMC)
      ' ON/OFFを切り替える
      Call ImmSetOpenStatus(hIMC, Not blnIME)
      ' IMEコンテキストの開放
      ImmReleaseContext hwndIME, hIMC
    End If
  End If
End Sub




---------------
※.余談
シートのIMEの制限であれば

メニューバーより
→ データ(D)
→→ 入力規則(L)
→→→ 日本語入力

で、Excel2003以下では制限を加えることも出来ます。

リボン形式のメニューからの操作手順は、こちらではわかりませんが、、、
入力規則機能は2007でもあるはずです。

IMEのOFFを、エクセルのシートで利用するのでしょうか?フォームで利用するのでしょうか?

わからなかったので、シートでのIME制御例として説明しています。
ってかシートであれば、APIを利用しないでも出来てしまいますが^^;;

一応余談として、最後に載せてます。

プログラミングとしては、以下の3工程を行ってください。


------------------------------------
※1.み~くんパパの仕事部屋(旧)より
http://www.mitene.or.jp/~sugisita/vb6_ime.html

「IMEのON/OFF」
を解凍

-------------------------...続きを読む

Q変換中の文字を表示させず、IMEを利用するには。

現在 VC9にて、IME入力を取得するプログラムを書いています。

そのプログラムには、エディットボックスなどが
なく、普通のウィンドウに対してImmGetContext()を行い、
現在の入力状況を取得しています。
ここで問題なのですが、この状態で実行すると、ウィンドウの左上に
変換中の文字が見えてしまいます。これを見えなくさせようと思い、
ImmDisableIMEを呼ぶと当然ながら、IMEからのメッセージは
なくなってしまいます。

要点は
・変換中の文字を見せることなく
・IMEの編集状況を取得するにはどうしたらよいか?
です。

環境はVC9、XP sp3になります。
よろしくお願いします。

Aベストアンサー

IMEの入力位置を移動するサンプル作ってみました。
imm.h使うの結構久しぶりなので、てこずりました。
テストとかしてませんので、バグあると思います。
参考にどうぞ。

----------------------------------------------------------------------
/*
* test_SetCaret.cxx
*
* Created on: 2009/02/11
* Author: yanch
*/
#define STRICT

#include <cstdio>
#include <windows.h>
#include <imm.h>

#define MEM_CLEAR(x)  ::ZeroMemory(&x,sizeof(x))
#define CLASS_NAME    TEXT("SAMPLE")
#define WINDOW_NAME  TEXT("test_SetCaret")

HWND  hMainWnd;

LRESULT  CALLBACK MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
LRESULT onKillFocus( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
LRESULT onSetFocus( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );

/*=============================================================================
=============================================================================*/
int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd )
{
  MSG  msg;
  HRESULT hRet;
  
  WNDCLASSEX wcex;

  MEM_CLEAR( wcex );
  wcex.cbSize = sizeof( WNDCLASSEX );
  wcex.style = CS_HREDRAW | CS_VREDRAW;
  wcex.lpfnWndProc = (WNDPROC)::MainWndProc;
  wcex.hInstance = hInst;
  wcex.hIcon = ::LoadIcon( 0, IDI_APPLICATION );
  wcex.hCursor = ::LoadCursor( 0, IDC_ARROW );
  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW);
  wcex.lpszClassName = CLASS_NAME;

  hRet = ::RegisterClassEx( &wcex );
  if ( !hRet ) return 0;

  hMainWnd = ::CreateWindowEx(
    0,
    CLASS_NAME,
    WINDOW_NAME,
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    0,
    0,
    hInst,
    0
    );
  if ( !hMainWnd )
    return 0;

  ::ShowWindow( hMainWnd, nShowCmd );
  ::UpdateWindow( hMainWnd );
  
  while ( ::GetMessage( &msg, 0, 0, 0 ) )
  {
    ::TranslateMessage( &msg );
    ::DispatchMessage( &msg );
  }

  return msg.wParam;
}

/*=============================================================================
=============================================================================*/
LRESULT  CALLBACK MainWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  switch ( uMsg )
  {
  case WM_KILLFOCUS:
    return onKillFocus( hWnd, uMsg, wParam, lParam );
  case WM_SETFOCUS:
    return onSetFocus( hWnd, uMsg, wParam, lParam );
  case WM_DESTROY:
    ::PostQuitMessage( 0 );
    return 0;
  }
  return ::DefWindowProc( hWnd, uMsg, wParam, lParam );
}


LRESULT onKillFocus( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  ::HideCaret(hWnd);
  ::DestroyCaret();
  return 0;
}
LRESULT onSetFocus( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
  int nNewPosX = 100;
  int nNewPosY = 100;
  
  ::CreateCaret(hWnd, NULL, 10, 10);
  ::SetCaretPos(nNewPosX, nNewPosY);
  HIMC hImc = ::ImmGetContext(hWnd);
  if (hImc)
  {
    COMPOSITIONFORM cpf;
    cpf.dwStyle = CFS_POINT;
    cpf.ptCurrentPos.x = nNewPosX;
    cpf.ptCurrentPos.y = nNewPosY;
    ImmSetCompositionWindow(hImc, &cpf);
    ImmReleaseContext(hWnd, hImc);
  }
  
  return 0;
}

// [EOF:test_SetCaret.cxx]
----------------------------------------------------------------------

IMEの入力位置を移動するサンプル作ってみました。
imm.h使うの結構久しぶりなので、てこずりました。
テストとかしてませんので、バグあると思います。
参考にどうぞ。

----------------------------------------------------------------------
/*
* test_SetCaret.cxx
*
* Created on: 2009/02/11
* Author: yanch
*/
#define STRICT

#include <cstdio>
#include <windows.h>
#include <imm.h>

#define MEM_CLEAR(x)  ::ZeroMemory(&x,sizeof(x))
#define CLASS_NAME   ...続きを読む

Qユーザコントロールのイベント取得について(C#)

環境:Visual Studio 2005 C# Windows Application
フォームに自作のユーザコントロールを貼り付けてそのイベントを取得する勉強をしているものです。

フォームでのユーザコントロールイベントを取得して処理をする方法が分かりません。

状況
ユーザコントロールにはテキストボックスを追加しています。
また、フォームにそのユーザコントロールを追加しています。

確認したいことは、ユーザコントロールのテキストボックスになにか値を入力したタイミングでチェンジイベントをフォーム側で察知し、処理をするというものです。

どなたか、要点だけでもいいので教えていただけないでしょうか?

宜しくお願いいたします。

Aベストアンサー

外部用のdelegateとコントロールで発生するイベント、内部コントロールで発生するイベントの関連付けを行いましょう

コントロール側のソースのclass定義の外で

  public delegate void ChangeEventHandler(object sender, EventArgs e);
といったデリゲートを設置します

コントロールのクラス定義の中で
// 外部で使うイベント名を定義 ... Changedを使用
public event ChangeEventHander Changed;
// 内部で発生したイベントを外部に知らせる
protected void OnChange( EventArgs e )
{
  // 外部のイベントハンドラが接続されているなら
  if ( Changed != null ) {
    Changed( this, e )
  }
}

private textBox1_TextChanged(object sender, EventArgs e)
{
  // 内部のイベントハンドラを呼び出す
  OnChaned(e);
}

といった記述になります

利用する側では
デザイナでコントロールを選択してプロパティウィンドウをイベントタブに切り替えて『Changed』ハンドラを追加するか

コードで
private void OnChanged(object s, EventArgs e)
{
  MessgeBox.Show("sampel");
}

private void Form_Load(object sender, EventArgs e)
{
  // コントロールのChangedイベントハンドラの設定
  UserControl1.Changed += new ChangeEventHandler( OnChanged )
}
といった具合にします

外部用のdelegateとコントロールで発生するイベント、内部コントロールで発生するイベントの関連付けを行いましょう

コントロール側のソースのclass定義の外で

  public delegate void ChangeEventHandler(object sender, EventArgs e);
といったデリゲートを設置します

コントロールのクラス定義の中で
// 外部で使うイベント名を定義 ... Changedを使用
public event ChangeEventHander Changed;
// 内部で発生したイベントを外部に知らせる
protected void OnChange( EventArgs e )
{
  /...続きを読む

Qテキストボックスからフォーカス外す

 editBox = CreateWindow(
  "EDIT",
  "あああ",
  SS_CENTER | WS_CHILD | WS_VISIBLE,
  0,0,100,20,
  hWnd,
  NULL,
  hInstance,
  NULL);


テキストボックスのフォーカスを外すにはどうしたら
いいんですか?
ESCキーでフォーカスを外そうと思ったら、
テキストボックスにフォーカスがあるせいで
case WM_KEYDOWN が動作しません。
フォーカスを外すというソース自体も分かっていません。


 case WM_KEYDOWN:
  if( wParam == VK_ESCAPE )
   ?
 break;

Aベストアンサー

WM_KILLFOCUS というメッセージがあります。これをエディットボックスのウィンドウに
送ってあげれば、フォーカスが外れると思います。

# WIN32 API なんて、久しぶりなので、ちょっと自信無し

QC#で自分のウインド・ハンドルを取得するにはどうすればよいのでしょうか

C#を勉強中のものですが、教えて下さい。

タイトル通りですが、自分自身のウインドハンドルを取得する方法はあるのでしょうか?

Aベストアンサー

フォーム(コントロール)のHandleプロパティで取得できます。

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

Q.NET3.5におけるキーボードの「全角/半角」キーは、Keys列挙体の何に対応している?

.NETで,キーボード入力で,ユーザの全角/半角入力状態を識別して処理するために,
・(1)キーの全角/半角を押したか(瞬間)
・(2)キーの全角/半角を押している最中か(押しっぱなし状態)
・(3)キーの全角モードか,半角モードか(NumLockのように,トグルがON)
の3種類を識別したいです.
(真ん中は,あまり区別する必要は無いです.)

そこで,ぬるり様のグローバルフックキーボード
http://hongliang.seesaa.net/article/7539988.html
を使って,
「全角/半角」キーを調べているのですが,
実際にキーボードの上記キーを押すと,
Keys列挙体の名前が
「ControlKey, OemBackslash」 ⇔ 「D4, Oemtilde」
の(3)トグル状態が交互に切り替わり,
望んだ「全角/半角」キー認識ができません.

MSDNライブラリ
http://msdn.microsoft.com/ja-jp/library/system.windows.input.key.aspx

を見ると,
・D4       数字1キー
・OemBackslashOEM バックスラッシュ キー
・OemTildeOEM チルダ キー
をなっていますが,上記キーを押していないのにこれらのKeysが取得さrてしまいます.
なお,「ControlKey」や「ControlKey, ***」という名前は存在しないように思います.

また,
・KanaModeIME かなモード キー
・KanjiModeIME 漢字モード キー
などはあるのですが,
欲しい,全角/半角キーは見当たりません.

Keys列挙体で日本語キーボードの「全角/半角」キーを管理するには,
どのようにしたらよいのでしょうか?
また,これらの余分なキーのトグルは,なぜ起こるかわかりましたら,お教えいただけると幸いです.

ちなみに,環境は
OS: WindowXP,キーボード: DELL製の日本語キーボード
です.
他に必要な情報がありましたら丁寧にお答えいたします.

.NETで,キーボード入力で,ユーザの全角/半角入力状態を識別して処理するために,
・(1)キーの全角/半角を押したか(瞬間)
・(2)キーの全角/半角を押している最中か(押しっぱなし状態)
・(3)キーの全角モードか,半角モードか(NumLockのように,トグルがON)
の3種類を識別したいです.
(真ん中は,あまり区別する必要は無いです.)

そこで,ぬるり様のグローバルフックキーボード
http://hongliang.seesaa.net/article/7539988.html
を使って,
「全角/半角」キーを調べているの...続きを読む

Aベストアンサー

書き忘れましたが、インストールされているIMEにより、全角/半角押下時の挙動が異なります。

IME98がインストールされていると、全角/半角キーにより発生するWM_KEYDOWNのwParamは、
・単体で押した場合、VK_DBE_SBCSCHARとVK_DBE_DBCSCHARが交互に押される。
・Altキーと同時に押した場合、VK_KANJIが押される。
のようになります。

特殊キーを一緒に押したかどうかで、キーコードがコロコロ変化するので、かなり厄介です。

しかも、この挙動は「IME98だけ」と思ってよく、IME2000や、ATOKでは、どういう挙動になるか「やってみないと判らない」です。

この「やってみないと判らない部分」は「インストールされたIMEシステム」が違いを吸収してくれます。そのおかげで「アプリから見た時、IMEが何になってても、すべて同じ処理で済ます事が可能」なのです。

逆に言えば「IMEを介して処理しないと、同じ処理で済ます事が出来ない」ことを意味します。

IMEをバイパスして処理しようと思うなら「どんなIMEがインストールされているか独自に判定し、入っているIMEごとに処理を変える」必要があるでしょう。じゃないと、IMEが誤動作します。

IMEが処理する特殊キーは、IMEに「おんぶにだっこ」するしかないのです。

書き忘れましたが、インストールされているIMEにより、全角/半角押下時の挙動が異なります。

IME98がインストールされていると、全角/半角キーにより発生するWM_KEYDOWNのwParamは、
・単体で押した場合、VK_DBE_SBCSCHARとVK_DBE_DBCSCHARが交互に押される。
・Altキーと同時に押した場合、VK_KANJIが押される。
のようになります。

特殊キーを一緒に押したかどうかで、キーコードがコロコロ変化するので、かなり厄介です。

しかも、この挙動は「IME98だけ」と思ってよく、IME20...続きを読む

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。


人気Q&Aランキング

おすすめ情報