PDA

View Full Version : حرفه ای: اگاهی از اتفاق افتادن یک event در صورتی که فوکوس روی فرم نباشد



Bug***
پنج شنبه 28 دی 1391, 17:21 عصر
سلام من می خوام وقتی کاربر داره با یک برنامه دیگه کار می کنه و فوکوس روی فرم من نیست از event ها اگاه بشم مثلا کاربر در حال تایپ کردن هست و برمامه من هم Minimize شده در این موقع من نمی تونم از event های mouse down و... با خبر بشم خواهش می کنم کسی راهی برای رفع این مشکل بدهد

farazjalili
پنج شنبه 28 دی 1391, 17:25 عصر
سلام تا جایی که من می دونم باید از هوک ویندوز استفاده کنی دربارش جستجو کن

Bug***
پنج شنبه 28 دی 1391, 20:51 عصر
یعنی هیچ راه دیگه نیست اگه می شه یکم بیشر درمورد هوک ویندوز توضیح بدید چون فقط رو همین جای کارم کنگ موندم اگرم کسی راه دیگه بلده خواهش می کنم که بگه

Bug***
پنج شنبه 28 دی 1391, 22:12 عصر
کسی نیست؟ اساتید یه کمک کوچیک بکنند مشکل من حل میشه ها

ara_tz
پنج شنبه 28 دی 1391, 22:14 عصر
سلام
من با Microsoft.DirectX.DirectInput حتی وقتی فوکوس روی برنامه ام نیست، میام جوی استیک رو کپچر میکنم. Microsoft.DirectX.DirectInput واسه موس و کیبورد هم سربرگ داره توی خودش.در موردش سرچ کن حتما کمکت میکنه

danialafshari
پنج شنبه 28 دی 1391, 23:34 عصر
اگر می خوای رویدادش رو بفهمی می تونی یک کیلاگر بسازی
در فروم زیاده

plus
جمعه 29 دی 1391, 02:14 صبح
یکی از راه هاش استفاده از Hook هست...Processing Global Mouse and Keyboard Hooks in C# (http://http://www.codeproject.com/Articles/7294/Processing-Global-Mouse-and-Keyboard-Hooks-in-C)

Bug***
جمعه 29 دی 1391, 19:20 عصر
میشه یکی به من بگه مشکل این برنامه چیه که اصلا event های کیبورد رو نمیگیره تو خود سایتش هم همینجوری نوشته بود یکی کمک کنه من حتی اون تیکه کدی که توی form load هست رو توی یه تایمر هم گذاشتم ولی باز جواب نداد:عصبانی++:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MouseKeyboardLibrary;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// Create the keyboard hook
KeyboardHook keyboardHook = new KeyboardHook();

// Capture the events
keyboardHook.KeyDown += new KeyEventHandler(keyboardHook_KeyDown);
keyboardHook.KeyUp += new KeyEventHandler(keyboardHook_KeyUp);
keyboardHook.KeyPress += new KeyPressEventHandler(keyboardHook_KeyPress);

// Start watching for keyboard events
keyboardHook.Start();


}


void keyboardHook_KeyPress(object sender, KeyPressEventArgs e)
{

AddKeyboardEvent(
"KeyPress",
"",
e.KeyChar.ToString(),
"",
"",
""
);

}

void keyboardHook_KeyUp(object sender, KeyEventArgs e)
{

AddKeyboardEvent(
"KeyUp",
e.KeyCode.ToString(),
"",
e.Shift.ToString(),
e.Alt.ToString(),
e.Control.ToString()
);

}

void keyboardHook_KeyDown(object sender, KeyEventArgs e)
{


AddKeyboardEvent(
"KeyDown",
e.KeyCode.ToString(),
"",
e.Shift.ToString(),
e.Alt.ToString(),
e.Control.ToString()
);

}
void AddKeyboardEvent(string eventType, string keyCode, string keyChar, string shift, string alt, string control)
{

label1.Text = keyCode;

}
}
}

Bug***
جمعه 29 دی 1391, 20:07 عصر
کسی نیست؟؟؟؟؟؟؟؟؟؟

barnamenevisjavan
شنبه 30 دی 1391, 13:43 عصر
نظر من اینه برنامه رو شبیه به کیلاگر پیاده سازی کنی که وقتی فوکوس روی برنامه نیست کلید های کیبورد رو ذخیره میکنه.میتونی نام پنجره فعال رو با کد زیر بدست بیاری:
using System.Runtime.InteropServices;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

// Declare external functions.
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
private static extern int GetWindowText(IntPtr hWnd,
StringBuilder text, int count);
یه تایمر بزار تو رویداد تیکش اینو بنویس سه تا لیبل هم بزار روی فرمت

private void tmrRefresh_Tick(object sender, EventArgs e)
{
int chars = 256;
StringBuilder buff = new StringBuilder(chars);

// Obtain the handle of the active window.
IntPtr handle = GetForegroundWindow();

// Update the controls.
if (GetWindowText(handle, buff, chars) > 0)
{
lblCaption.Text = buff.ToString();
lblHandle.Text = handle.ToString();
if (handle == this.Handle)
{
lblCurrent.Text = "True";
}
else
{
lblCurrent.Text = "False";
}

با کدهای بالا میتونی حتی اگر فوکوس روی برنامه نباشه اسم پنجره فعال رو بدست بیاری امیدوارم واست راه گشا باشه

Bug***
سه شنبه 03 بهمن 1391, 22:48 عصر
ممنونم دوست عزیز ولی من همچنان می خوام بدونم که مشکلی کدی که در بالا گذاشتم چیه اگه منو در اون ضمینه راهنمایی کنی خیلی ممنونت می شم

aboulfazl950
چهارشنبه 04 بهمن 1391, 11:48 صبح
سلام
من با Microsoft.DirectX.DirectInput حتی وقتی فوکوس روی برنامه ام نیست، میام جوی استیک رو کپچر میکنم. Microsoft.DirectX.DirectInput واسه موس و کیبورد هم سربرگ داره توی خودش.در موردش سرچ کن حتما کمکت میکنه

لطفا یک نمونه برنامه قرار بدهید

Bug***
چهارشنبه 04 بهمن 1391, 22:09 عصر
کسی نیست منو تو اون کد کمک کنه