Тема: ToASCII - C#
Показать сообщение отдельно

  #9  
Старый 27.08.2009, 18:29
QJHoly
Новичок
Регистрация: 28.11.2007
Сообщений: 13
Провел на форуме:
115313

Репутация: 1
По умолчанию

Вот класс который я составил:
Код:
class KeyboardHook
    {
       [DllImport("user32")] 
       public static extern int OemKeyScan(int wOemChar); 
       [DllImport("user32", EntryPoint = "PostMessageA", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
       public static extern bool PostMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
       [DllImport("user32.dll")]
       static extern uint MapVirtualKey(uint uCode, uint uMapType);

       static int WM_KEYDOWN = 0x0100;
       static int WM_KEYUP = 0x0101;
       static int WM_CHAR = 0x0102;


        static byte ORD(char ch)
       {
           return System.Text.Encoding.ASCII.GetBytes(new char[] { ch })[0];
       }

        public static void SendShift(bool Down)
       {
          ushort vKey, ScanCode, wParam;
          int lParam;
          vKey = 0x10;
          ScanCode = MapVirtualKey(vKey, 0);
          wParam = vKey || ScanCode << 8;
          lParam = longint(ScanCode) << 16 || 1;
          if (!Down)
          { lParam = lParam || 0xC0000000; }
          PostMessage(BotContro1l.mem.WindowHandle, WM_KEYDOWN, vKey, lParam);
        }

        public static void SendCtrl(bool Down)
        {
            ushort vKey, ScanCode, wParam;
            int lParam;
            vKey = 0x11;
            ScanCode = MapVirtualKey(vKey, 0);
            wParam = vKey || ScanCode << 8;
            lParam = longint(ScanCode) << 16 || 1;
            if (!Down)
            { lParam = lParam || 0xC0000000; }
            PostMessage(BotContro1l.mem.WindowHandle, WM_KEYDOWN, vKey, lParam);
        }



        public static void SendKey(char Key)
        {
          ushort ScanCode, vKey, wParam;
          int lParam, ConvKey;
          bool Shift, Ctrl;

            ConvKey = OemKeyScan(ORD(Key));

            ScanCode = (ConvKey && 0x000000FF) || 0xFF00;
            vKey = ORD(Key);
            wParam = vKey;
            lParam = (int)ScanCode << 16 || 1;

            if ((ConvKey && 0x00020000) != 0) 
            SendShift(true);
            if ((ConvKey && 0x00040000) != 0) 
            SendCtrl(true);

            PostMessage(BotContro1l.mem.WindowHandle, WM_KEYDOWN, vKey, lParam);
            PostMessage(BotContro1l.mem.WindowHandle, WM_CHAR, vKey, lParam);
            lParam = lParam || 0xC0000000;
            PostMessage(BotContro1l.mem.WindowHandle, WM_KEYUP, vKey, lParam);

            if ((ConvKey && 0x00020000) != 0)
            SendShift(false);
            if ((ConvKey && 0x00040000) != 0)
            SendCtrl(false);
        }


        public static void SendString(string s)
        {
            for (int i = 1; i != s.Length; i++)
            {
                SendKey(s[i]);
            }
        }

    }
Проблема в том что Я не понимаю для чего в Deplhi используется в переменных and or и тп. И зачем по
битовый снов используется. Кому не трудно распишите.

Кто-нибудь может показать как эти строки на C# буду выглядеть?
Код:
Ctrl:= (ConvKey and $00040000) <> 0;
wParam:= vKey or ScanCode shl 8;
ScanCode:= ConvKey and $000000FF or $FF00;

Последний раз редактировалось QJHoly; 28.08.2009 в 04:27..
 
Ответить с цитированием