2
Oracle에서 채워진 데이터에 사용 된 키보드 이벤트를 시뮬레이트하는 작은 프로그램을 만들었지 만, 밑줄 문자를 소개하기 위해 keybd_event를 사용할 때 출력이 잘못되었습니다. _이 마지막 문자가 아닌 경우, 프로그램이 다음 문자가 자동으로 문자를 추가 시뮬레이션 할 때 - Keybd_event가 잘못된 출력을 제공합니다.
누군가가 나를 도울 수 09_80
예 은 내가 VK_OEM_MINUS 출력과 VK_RSHIFT의 조합을 사용하여 밑줄을 위해 테이프 09_80 필요하다? 나는 InputSimulator으로도 시도하지만 미리 내 프로그램에서 코드 몇 줄 아래에 다음, 윈도우 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;
을 감사를 실행했다 여기서
// 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 인 경우 밑줄 뒤에 다른 문자를 테이프 할 때입니다. –