|
分類:[C#]
環境: win10 64bit VisualStudio 2015comm
言語: C# (.NET Framework)
タイトルに書いた通り、他アプリケーションにキー入力を送信したく、
PostMessageによる物を実装しました
シミュレートしたいのはCtrl + S
上書き保存のショートカットキーですね。
メニューのハンドル取得でもいいのですが、対象のアプリケーションが不特定で、あるアプリケーションに限ったものではない(伝わりにくい)、メインウィンドウハンドル取得からポストで動くしいいんじゃねぇのみたいな感じで実装しました。
そこで、なんですが、 自分が実装しましたプログラムでは32bitアプリケーションにはしっかりポストされ、上書き保存も出来ています。
しかし、64bitのアプリケーションに送るとポストはされても無反応、つまり上書き保存がされないのです。
Spy++でログも確認済です。
LParamについてなんですが、
ctrl down 0x001D0001
s down 0x001F0001
ctrl up 0xC01D0001
s up 0xC01F0001
でnew IntPtrしてたんですけど、色々サイト見てるとIntPtr.Zeroが多かったのでこっちにしました。
SendKeyでは上書き保存ができました。スキャンコード?みたいなのは00でなってたのでDirectInputではないと思います(自分の知識が間違ってたらごめんなさい)
ログはすべてメインウィンドウハンドルで確認しました。
自分でCtrl + Sした時とPostMessageした時のログはほぼ一緒で何が違うのかさっぱりわかりませんでした。
違うのはLparamとWM_CHARが生成されることくらいですが、LParamも全く同じにしてポストした時も上書き出来ませんでした。
文章が分かりにくい部分もあるかと思いますが、
何が違うか、または送信先のアプリケーション側の問題なのか
解決策を教えてください。お願いします。
実装コードの一部
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr PostMessage(IntPtr hWnd, IntPtr Msg, IntPtr wParam, IntPtr lParam);
public IntPtr WM_KEYDOWN = new IntPtr(0x0100);
public IntPtr WM_KEYUP = new IntPtr(0x0101);
public IntPtr VK_Ctrl = new IntPtr(0x11);
public IntPtr VK_S = new IntPtr(0x53);
private void button2_Click(object sender, EventArgs e)
{
/*
* GetProcessByNameでメインウィンドウハンドルを取得
*/
PostMessage(mainWindowHandle, WM_KEYDOWN, VK_Ctrl, IntPtr.Zero);
PostMessage(mainWindowHandle, WM_KEYDOWN, VK_S, IntPtr.Zero);
PostMessage(mainWindowHandle, WM_KEYUP, VK_S, IntPtr.Zero);
PostMessage(mainWindowHandle, WM_KEYUP, VK_Ctrl, IntPtr.Zero);
}
|