win10で、自作プログラムが少々動作がおかしいというか、元々実装していかなったというか?
プラグインでセルを、キーイベントはなかったっす。
.Change += Acsheet_Change;
.BeforeRightClick += Acsheet_BeforeRightClick;
.BeforeDoubleClick += Acsheet_BeforeDoubleClick;
上記が、最近のVSTOで使えなくなりました。
ガックシ (´・ω・`)
そこで、プラグイン利用しないで、実装! 確認 覚書
static class keyManager{
delegate int LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
static readonly LowLevelKeyboardProc _proc = HookCallback;
static IntPtr _hookID = IntPtr.Zero;
const int WH_KEYBOARD = 2;
const int HC_ACTION = 0;
[DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
static extern bool UnhookWindowsHookEx(IntPtr idHook);
[DllImport(“user32.dll”, CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
[DllImport(“user32.dll”)]
static extern short GetKeyState(int nVirtKey);
static bool _keyHookingStarted;
public static void Start() {
if (!_keyHookingStarted) {
#pragma warning disable 0618
_hookID = SetWindowsHookEx(WH_KEYBOARD, _proc, IntPtr.Zero, (uint) AppDomain.GetCurrentThreadId());
#pragma warning restore 0618
_keyHookingStarted = true;
}
}
public static void Stop() {
if (_keyHookingStarted) {
UnhookWindowsHookEx(_hookID);
_hookID = IntPtr.Zero;
_keyHookingStarted = false;
}
}
static void OnKeyPress(uint keys) {
Func<Keys, bool> checkKey = key => keys == (uint) key && IsKeyDown(key);
//checks that shift, alt, ctrl and win keys are not pressed
Func checkModifiers = () => !IsKeyDown(Keys.ShiftKey)
&& !IsKeyDown(Keys.Menu) // Keys.Menu is Alt button code
&& !IsKeyDown(Keys.LWin) && !IsKeyDown(Keys.RWin);
if (checkModifiers() && (checkKey(Keys.Enter) || checkKey(Keys.Return))) {
//エンターを押した場合にエクセルに入力する場合はここに記述
}
//キーによって最終判断するのはここに記述
//フォームコントロールの場合は、スレッドを利用しているため2重に起動する場合あり、
//フォームのハンドルを監視して制御させる必要あり。
}
static bool IsKeyDown(Keys keys) {
return (GetKeyState((int) keys) & 0x8000) == 0x8000;
}
static int HookCallback(int nCode, IntPtr wParam, IntPtr lParam) {
if (nCode < 0) {
return (int) CallNextHookEx(_hookID, nCode, wParam, lParam);
}
if (nCode == HC_ACTION) {
OnKeyPress((uint) wParam);
}
return (int) CallNextHookEx(_hookID, nCode, wParam, lParam);
}
}
これでOK.
アドイン読込で初めて
アドイン終わらせて停止させる必要あり
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
keyManager.Start();
}
private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
{
keyManager.Stop();
}