|
回答ありがとうございます。
頂いたヒントに従い、当初は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);
}
}
}
より簡単な方法もあるかと思いますが、ひとまず解決したので解決済みとします。
ご協力ありがとうございました。
|