C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■98289 / 2階層)  データグリッドビューでクリックだけで複数行選択
□投稿者/ tosh (4回)-(2021/10/28(Thu) 17:03:47)
回答ありがとうございます。

頂いたヒントに従い、当初はkeybd_eventを使っての実現を試みました。
目的の複数行選択は実現できたのですが、Ctrlキーを押した状態のままにすると
その後の操作が全てCtrl押しっぱなし状態になってしまうので
下記の様に処理を行った後に解除する様にしたのですが、
そうすると複数行選択もできなくなってしまいました。

    win32api.keybd_event(VK_CONTROL, 0, 0, (System.UIntPtr)0);
    base.WndProc(ref m);
    win32api.keybd_event(VK_CONTROL, 0, 0x02, (System.UIntPtr)0);


そこでGetKeyStateでキー押下状態を取得できるとのヒントから
GetKeyboardStateとSetKeyboardStateの使い方を調べ、最終的に
以下の方法で実現する事ができました。


namespace System.Windows.Forms
{
    public class DataGridViewCustom : DataGridView
    {

        [DllImport("user32.dll")]
        private static extern int
        SetKeyboardState([MarshalAs(UnmanagedType.LPArray)]byte[] lpKeyState);

        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetKeyboardState(byte[] lpKeyState);

        [SecurityPermission(SecurityAction.Demand,
        Flags = SecurityPermissionFlag.UnmanagedCode)]
        protected override void WndProc(ref Message m)
        {
            const int WM_LBUTTONDOWN = 0x0201;
            const int MK_CONTROL = 0x0008;
            const int VK_CONTROL = 0x11;

            switch (m.Msg)
            {
                case WM_LBUTTONDOWN:

                    byte[] keyState = new byte[256];

                    // キー押下状態の取得
                    GetKeyboardState(keyState);
                    
                    // Ctrlキー押下状態の保存
                    byte ctrlKeyStateBack = keyState[VK_CONTROL];

                    // Ctrlキーを押下状態にする
                    keyState[VK_CONTROL] |= 0x80;
                    
                    // キー押下状態の反映
                    SetKeyboardState(keyState);

                    base.WndProc(ref m);
					
                    // Ctrlキー押下状態の復元と反映
                    keyState[VK_CONTROL] = ctrlKeyStateBack;
                    SetKeyboardState(keyState);
                    
                    return;
            }
            base.WndProc(ref m);
        }
    }
}

より簡単な方法もあるかと思いますが、ひとまず解決したので解決済みとします。
ご協力ありがとうございました。

解決済み
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: データグリッドビューでクリックだけで複数行選択 /KOZ 返信無し
 
上記関連ツリー

データグリッドビューでクリックだけで複数行選択 / tosh (21/10/28(Thu) 09:22) #98283
Re[1]: データグリッドビューでクリックだけで複数行選択 / 大谷刑部 (21/10/28(Thu) 13:34) #98286
Re[1]: データグリッドビューでクリックだけで複数行選択 / KOZ (21/10/28(Thu) 15:39) #98287
│└ データグリッドビューでクリックだけで複数行選択 / tosh (21/10/28(Thu) 17:03) #98289 解決済み ←Now
Re[1]: データグリッドビューでクリックだけで複数行選択 / 魔界の仮面弁士 (21/10/28(Thu) 16:37) #98288
  └ Re[2]: データグリッドビューでクリックだけで複数行選択 / tosh (21/10/28(Thu) 17:11) #98290

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信