Вот что я пытаюсь сделать: Существует некоторая игра, которая записывает некоторую информацию об элементе под курсором мыши в буфер обмена, когда я нажимаю Ctrl-C. Я пытаюсь захватить эту информацию и выбрать некоторые вещи, которые мне нужны. Im делает это так:Clipboard.GetText переопределяет буфер обмена?
//at form load
RegisterHotKey(this.Handle, 0, 0x002, (int)Keys.C);
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
int id = m.WParam.ToInt32();
if (id == 0)
{
System.Threading.Thread.Sleep(155); //ive thought if i add some delay it would help but it doesnt...
string textFromClipboard = Clipboard.GetText();
if (textFromClipboard.Contains("Itemlevel: "))
{
// do some stuff with data IF it exists in clipboard, doesnt important what i do - i never get here
}
}
}
base.WndProc(ref m);
}
Так в основном, когда я нажимаю Ctrl-C в игре без этой программы на - все отлично работает, информация скопирована в буфер обмена. Когда я включаю программу - буфер обмена остается таким же, как и до того, как я нажму Ctrl-C в игре. Как я могу предотвратить это? Как правильно получить текст из буфера обмена? Может, способ, которым я получаю этот текст, не так? Или может быть, что зарегистрированная горячая клавиша вмешивается в горячую клавишу игры, так что она больше не работает?
обновление: Ive выяснил какое-то простое решение, но очень грубое и варварское. Но он отлично работает.
public static void KeyDown(System.Windows.Forms.Keys key)
{
keybd_event((byte)key, 0x45, 0x0001 | 0, 0);
}
public static void KeyUp(System.Windows.Forms.Keys key)
{
keybd_event((byte)key, 0x45, 0x0001 | 0x0002, 0);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0312)
{
int id = m.WParam.ToInt32();
if (id == 0)
{
ToggleHotkeys(false);
KeyDown(Keys.Control);
KeyDown(Keys.C);
KeyUp(Keys.C);
KeyUp(Keys.Control);
System.Threading.Thread.Sleep(155);
//if i comment this sleep - code executes too fast, making first Ctrl-C press
//capture nothing, second press outputs results for first item
//third press - for second item, ...
string textFromClipboard = Clipboard.GetText();
if (textFromClipboard.Contains("Itemlevel: "))
{
//do stuff with data
}
ToggleHotkeys(true);
}
}
base.WndProc(ref m);
}
Возможно, существует более умный способ решить эту проблему?
Почему вам нужно для 'Sleep' текущий поток? Я сомневаюсь, что это проблема. –
С или без буфера обмена 'sleep' остается таким же, как и до того, как я нажму Ctrl-C –
Я думаю, что когда вы не запустите код выше, будет обработан по умолчанию ** Ctrl + C ** и текст будет скопирован а также обновить содержимое буфера обмена. При запуске кода выше по умолчанию ** Ctrl + C ** может быть * переопределено * зарегистрированной горячей клавишей, и все * автоматическое * копирование не будет выполнено для вас, это означает, что вам нужно добавить код для копирования самостоятельно , –