 |
C# Скрипт или макрос. - Вопросы и ответы, обсуждения - Ваши вопросы по C# только в данном разделе |
04.05.2017, 11:35
|
#1
|
|
|
|
Разведчик
|
 Регистрация: 04.05.2017
 Сообщений: 0
 Популярность: 10
 Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
|
C# Скрипт или макрос.
Добрый день.
Как в с# реализовать мою идею?
Идея вот в чем.
Запускаю прогу WPF и захожу в игру. Нажимаю на клавишу которую забиндил и выполняется скрипт.
Вроде на словах просто))
Но как реализовать? Создаю форму wpf, затем кликаю на события осного процесса приложения и пользуясь методом Send.Keys пишу скрипт. Что-то типа
if(KeyCode==Key.F1)
Send.Keys("{qwert});
(код ужасный может где ошибку допустил, это больше для наглядности метода который я использую)
Проблема в том что мой код выполняется только при активном окне моей формы, и только в самой форме. Как сделать так что бы прога принемала нажатие клавишь тогда когда она в свернутом виде, и посылала команды не в форму а в игру.
Можно сказать пытаюсь сделать что-то наподобии AHK только свое))
Может библиотеку какую подключить, или в настройках полазить что бы прога работала в фоновом процессе. Любая информация будет полезна.
|
|
|
04.05.2017, 18:31
|
#2
|
|
|
|
Разведчик
|
 Регистрация: 11.10.2010
 Сообщений: 13
 Популярность: 10
 Сказал(а) спасибо: 3
Поблагодарили 5 раз(а) в 5 сообщениях
|
Re: C# Скрипт или макрос.
Насколько я понял, вам нужен глобальный хук клавиш.
Можете почитать об этом в интернете.
Лично я пользуюсь вот этим классом (написал не сам, нашел в интернете):
Код:
class globalKeyboardHook
{
public struct keyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
const int WH_KEYBOARD_LL = 13;
const int WM_KEYDOWN = 0x100;
const int WM_KEYUP = 0x101;
const int WM_SYSKEYDOWN = 0x104;
const int WM_SYSKEYUP = 0x105;
public List<Keys> HookedKeys = new List<Keys>();
IntPtr hhook = IntPtr.Zero;
public event KeyEventHandler KeyDown;
public event KeyEventHandler KeyUp;
public globalKeyboardHook()
{
hook();
}
~globalKeyboardHook()
{
unhook();
}
public void hook()
{
IntPtr hInstance = LoadLibrary("User32");
//hhook = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, hInstance, 0);
delegateHookProc = hookProc;
hhook = SetWindowsHookEx(WH_KEYBOARD_LL, delegateHookProc, hInstance, 0);
}
public delegate int keyboardHookProc(int code, int wParam, ref keyboardHookStruct lParam);
keyboardHookProc delegateHookProc;
public void unhook()
{
UnhookWindowsHookEx(hhook);
}
public int hookProc(int code, int wParam, ref keyboardHookStruct lParam)
{
if (code >= 0)
{
Keys key = (Keys)lParam.vkCode;
if (HookedKeys.Contains(key))
{
KeyEventArgs kea = new KeyEventArgs(key);
if ((wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN) && (KeyDown != null))
{
KeyDown(this, kea);
}
else
if ((wParam == WM_KEYUP || wParam == WM_SYSKEYUP) && (KeyUp != null))
{
KeyUp(this, kea);
}
if (kea.Handled)
return 1;
}
}
return CallNextHookEx(hhook, code, wParam, ref lParam);
}
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, keyboardHookProc callback, IntPtr hInstance, uint threadId);
[DllImport("user32.dll")]
static extern bool UnhookWindowsHookEx(IntPtr hInstance);
[DllImport("user32.dll")]
static extern int CallNextHookEx(IntPtr idHook, int nCode, int wParam, ref keyboardHookStruct lParam);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string lpFileName);
}
Использовать можно следующим образом:
Код:
public partial class MainWindow : Window
{
globalKeyboardHook hook;
public MainWindow()
{
hook = new globalKeyboardHook();
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
hook.HookedKeys.Add(Keys.D1);
hook.KeyUp += new System.Windows.Forms.KeyEventHandler(gkh_KeyUp);
}
void gkh_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.KeyCode == Keys.D1)
{
System.Windows.MessageBox.Show("1 нажато");
}
}
}
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 04:15.
|
 |