2
Oracleの塗りつぶしデータに使用したキーボードイベントをシミュレートする小さなプログラムを作成しましたが、文字のアンダースコアを導入するためにkeybd_eventを使用すると出力が間違っています _プログラムは次の文字が自動的に文字を追加するシミュレートしたときに - Keybd_eventがアンダースコアで間違った出力を提供する
は、誰かが私を助けてもらえ 09_80
例 は私がVK_OEM_MINUS 出力とVK_RSHIFTの組み合わせを使用し、アンダースコアのためにテープ09_80 に必要なのですか? 私はInputSimulatorでもしようとしたが、それは私のプログラムからのコードのいくつかの行の下にここだけのWindows 8で正しくを実行し、事前に おかげ 敬具
//キーボードアクション
[DllImport("user32.dll", SetLastError = true)]
public static extern void keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);
[DllImport("user32.dll")]
public static extern int MapVirtualKey(int uCode, int uMapType);
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern short VkKeyScan(char ch);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern string SendMessage(IntPtr hWnd, int msg, string wParam, IntPtr lParam);
public const int KEYEVENTF_EXTENDEDKEY = 0x0001;
public const int KEYEVENTF_KEYUP = 0x0002;
ました
// SEND CHAR
public static void SendChar(char c)
{
if (bw.CancellationPending)
{
return;
}
if(c=='_')
{
keysPress(VK_RSHIFT,VK_OEM_MINUS)
}
int vk = VkKeyScan(c);
int sc = MapVirtualKey(vk, 0);
PressKeyDn(vk, sc);
ReleaseKeyUp(vk, sc);
}
//SEND STRING
public static void SendString(string s)
{
foreach (char c in s)
{
SendChar(c);
}
}
//PRESS KEY DOWN
public static void PressKeyDn(int VK_Code, int SC_Code)
{
keybd_event(VK_Code, SC_Code, 0, 0);
}
//RELEASE KEY UP
public static void ReleaseKeyUp(int VK_Code, int SC_Code)
{
keybd_event(VK_Code, SC_Code, KEYEVENTF_KEYUP, 0);
}
//Press Special Key
public static void keyPress(int VK_key)
{
if (bw.CancellationPending)
{
return;
}
int sc = MapVirtualKey(VK_key, 0);
PressKeyDn(VK_key, sc);
ReleaseKeyUp(VK_key, sc);
}
//Press Special Key Combination 2 keys
public static void keysPress(int VK_Key1,int VK_Key2)
{
if (bw.CancellationPending)
{
return;
}
int sc1 = MapVirtualKey(VK_Key1, 0);
int sc2 = MapVirtualKey(VK_Key2, 0);
PressKeyDn(VK_Key1, sc1);
PressKeyDn(VK_Key2, sc2);
ReleaseKeyUp(VK_Key2, sc2);
ReleaseKeyUp(VK_Key1, sc1);
}
//Press Special Key Combination 3 keys
public static void keysPress(int VK_Key1, int VK_Key2,int VK_Key3)
{
if (bw.CancellationPending)
{
return;
}
int sc1 = MapVirtualKey(VK_Key1, 0);
int sc2 = MapVirtualKey(VK_Key2, 0);
int sc3 = MapVirtualKey(VK_Key3, 0);
PressKeyDn(VK_Key1, sc1);
PressKeyDn(VK_Key2, sc2);
PressKeyDn(VK_Key3, sc3);
ReleaseKeyUp(VK_Key3, sc3);
ReleaseKeyUp(VK_Key2, sc2);
ReleaseKeyUp(VK_Key1, sc1);
}
Sigh、キーストロークをシミュレートするさまざまな方法が失敗する可能性があります... VK_RSHIFTが正しくない、左右のシフトキーが同じ仮想キーを生成します。どちらがダウンしているかを確認する必要がある場合のみ、VK_L/RSHIFTを使用します。代わりにVK_SHIFTを使用する必要があります。それが問題を生み出すかどうか、まあ、おそらく。 –
残念ながら私はVK_RSHIFT + VK_OEM_MINUS、VK_LSHIFT + VK_OEM_MINUS、VK_SHIFT + VK_OEM_MINUSを試してみましたが、結果は常に同じです。 アンダースコアが最後の文字の場合、結果はokです(テープが0の場合は結果が0です)。 問題は、別の文字をアンダースコアの後にテープし、テープ0_を必要とし、別の0の後に結果が0_-0になる場合です –