1

私は非常に奇妙な問題を抱えているので、適切なタイトルを付けることはほとんどできません。

要するに、CDialog から派生したダイアログを使用して、MSVC++/MFC で記述された COM オブジェクトがあります。そのダイアログには、プレーンな CWnd から派生したウィンドウである 3 つの子「ユーザー コントロール」があります。

この COM オブジェクトをさまざまな場所から使用すると、すべてが期待どおりに機能します。しかし、C# アプリケーション (.exe ファイル) から使用すると、キーボードの動作が異なります。つまり、壊れていると言えます。

そして、異なるということは、次のことを意味します。

  • 「ユーザーコントロール」のいずれかにフォーカスがあるときに押された各キーは、WM_KEYDOWNメッセージを飲み込もうとしても、どこかから「エラービープ」を生成します
  • WM_CHAR / OnCharは「ユーザーコントロール」によって受信されませんが、Spy ++は投稿されていると言います
  • OnKeyDown と OnChar の最初に MessageBox を配置すると、突然 OnChar が呼び出され、OnKeyDown の最初にある MessageBox が表示される前に呼び出されます
  • OnKeyDown からメッセージを投稿することで OnChar が呼び出されないことを克服できますが、ビープ音を止める方法がわかりません

これは、非 .NET アプリケーションから使用されている COM オブジェクト ダイアログと比較して、すべて変更された動作です。

私は完全に満足していない回避策を見つけたので、誰かがこの問題に光を当てることができれば、私はとても幸せです! :-)

回避策は次のようになります。次のように、「ユーザーコントロール」を作成する代わりに:

m_mheSpell.CreateEx(
    WS_EX_CLIENTEDGE,
    NULL,
    "",
    WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL,
    4,18,340,100,
    GetSafeHwnd(), (HMENU)3000 );

私はそれを次のように変更します:

m_mheSpell.CreateEx(
    WS_EX_CLIENTEDGE,
    "Edit",  // <-- changed here
    "",
    WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_VSCROLL,
    4,18,340,100,
    GetSafeHwnd(), (HMENU)3000 );

次に、キーボード、マウス、およびフォーカス メッセージをブロックして、基になる編集コントロールが混乱しないようにする必要があります。いくつかの重要なメッセージをブロックするのを逃し、ユーザーが自分で見つける前に予期しない動作を見つけるのではないかと心配しています...

要するに、「何か」(周囲の .NET 環境に関連するもの) は、私の「CWnd コントロール」がキーボード処理を行うことができないと考え、私を台無しにします。「編集」から派生することで、この「何か」を変更することができます。周囲のプロセスが、たとえば VB6 アプリケーションである場合、これはすべて発生しません。

誰か?

4

1 に答える 1

1

ああ、これで自分の質問に答えることができます: WM_GETDLGCODE ため息

于 2009-02-17T19:00:19.323 に答える