PDA

View Full Version : یه مشکل در استفاده از RegisterHotKey



h_sadeghynejad
چهارشنبه 09 خرداد 1386, 23:49 عصر
راستش من یه Class نوشتم برای Register کردن کلید ها اما کار نمیکنه میشه ببینید مشکلش چیه
8788

h_sadeghynejad
پنج شنبه 10 خرداد 1386, 13:55 عصر
هیچکی نیست با این تابع Api کار کرده باشه
حداقل یه روش برای درست کردن SHortCut بگید

h_sadeghynejad
پنج شنبه 10 خرداد 1386, 18:09 عصر
هیچکس نیست یه جوابی به من بده

Hamid_PaK
پنج شنبه 10 خرداد 1386, 18:13 عصر
یه کامپوننت به زبان دلفی نوشته بودم که کار می کنه ببین مشکل کدت کجاست ....

یا حق ...

h_sadeghynejad
پنج شنبه 10 خرداد 1386, 18:29 عصر
جناب Hamid_PaK (http://barnamenevis.org/forum/member.php?u=10875) دستت درد نکنه اما چون Delphi کارنکردم اصلا نفهمیدم که این کد چجوری هستش اگه میشه با VB یا #C توضیح بدی
متشکرم

h_sadeghynejad
پنج شنبه 10 خرداد 1386, 23:45 عصر
راستش من هنوز مشکلم حل نشده خیلی هم ضروری هستش اگه میشه یه کمکی بکنید

Hamid_PaK
جمعه 11 خرداد 1386, 04:24 صبح
به این کد یه نگاهی بیاندازید ...


procedure THotKeyItem.DotRegHotKey;
var
Key: Word;
Shift: TShiftState;
ShiftEx: Integer;
begin
if FHotKeyID <> 0 then;
UnRegHotKey;
ShortCutToKey(FHotKey, Key, Shift);
if FHotKey <> 0 then
begin
ShiftEx := 0;
if ssAlt in Shift then ShiftEx := ShiftEx + MOD_ALT;
if ssCtrl in Shift then ShiftEx := ShiftEx + MOD_CONTROL;
if ssShift in Shift then ShiftEx := ShiftEx + MOD_SHIFT;
FHotKeyID := $A000 + ID;
if not RegisterHotKey(Application.Handle, FHotKeyID, ShiftEx, Key) then
raise Exception.Create('Could not register the hot key ...');
end;
end;

در قسمت پر رنگ شده تنظیمات یک تابع API هست که کلید را در ویندوز تعریف می کند ...
تا اینجا که نباید مشکلی باشه ، فقط اگه کلید درخواستی شما توسط برنامه ی دیگری رزرو نشده باشه ...


constructor THotKeyManager.Create(AOwner: TComponent);
begin
FHotKeys:= THotKeyCollection.Create(Self);
inherited Create(AOwner);
if not (csDesigning in ComponentState) then
Application.HookMainWindow(WMHotKey);
end;

اینجا هم تابعی که باید فشرده شدن کلیدهای ثبت شده را هوک کنه در فرم اصلی برنامه تعریف میشود...


function THotKeyManager.WMHotKey(var Msg: TMessage): Boolean;
var i: Integer;
begin
if Msg.Msg = WM_HOTKEY then
begin
for i:= 0 to HotKeys.Count - 1 do
if Msg.wParam = HotKeys[i].HotKeyID then
begin
Result:= True;
if Assigned(HotKeys[i].OnHotKeyActivation) then
HotKeys[i].OnHotKeyActivation(HotKeys[i]);
Exit;
end;
end;
Result:= False;
end;

این هم همان تابع هوک است ...

شما تنها باید اینها رو به VB تبدیل کنید ...

یا حق ...

h_sadeghynejad
جمعه 11 خرداد 1386, 08:50 صبح
جناب Hamid_PaK (http://barnamenevis.org/forum/member.php?u=10875) متشکرم به خاطر وقتی که گذاشتید
راستش من این دو رو چک کردم عین هم بودن از لحاظ منطقی نباید مشکلی داشته باشه نمیدونم چرا این طوری شده

Hamid_PaK
جمعه 11 خرداد 1386, 11:48 صبح
مشکل کجاست ؟؟؟

یا حق ...

h_sadeghynejad
جمعه 11 خرداد 1386, 13:13 عصر
مشکل اینه که اجرا میشه و کلید مربوطه رو ریجستر میکنه اما تابع



Public Sub WndProc(ByRef m As Message)
Select Case m.Msg
Case WM_HOTKEY
If m.WParam.ToInt32 = hotkeyID Then
AppActivate(System.Diagnostics.Process.GetCurrentP rocess.Id)
MessageBox.Show("Hotkey ID " & m.WParam.ToString & " pressed.")
End If
End Select
WndProc(m)
End Sub


که مربوط به این هستش که هر دفعه چک کنه که کلید زده شده یا نه رو اصلا اجرا نمیکنه
البته این تابع داخل خود کلاس تعریف شده

حامد مصافی
جمعه 11 خرداد 1386, 22:17 عصر
سلام دوست عزیز

یک مثال برات نوشتم.
ببینش

h_sadeghynejad
جمعه 11 خرداد 1386, 22:35 عصر
جناب BlackDal (http://barnamenevis.org/forum/member.php?u=6808) متشکرم - من میخواستم که اگه میشه یه طوری بشه که مجبور نباشم توی هر فرم این کد رو بنویسم آخه میخوام توی هر فرم کلید های مربوط به خودش ست بشه
مشکلم با یه فایل Dll حل شد این فایل رو که از CodeProject دانلود کردم رو توی برنامه در حالتی میتونم استفاده کنم که توی هر فرم فقط یه HotKey باشه اما اگه خواسته باشم که توی هر فرم چند hotKey داشته باشم نمیدونم چیکار باید بکنم اگه میشه ببینید میشه هیچکارش کرد
این هم فایل Dll
8840
متشکرم

Hamid_PaK
شنبه 12 خرداد 1386, 15:29 عصر
این که کجا باشه اهمیتی نداره ، کجای برنامه این تابع را برای بازرسی پیغامها فعال می کنید ؟؟؟
مثال :

constructor THotKeyManager.Create(AOwner: TComponent);
begin
FHotKeys:= THotKeyCollection.Create(Self);
inherited Create(AOwner);
if not (csDesigning in ComponentState) then
Application.HookMainWindow(WMHotKey);
end;
باید تابع هوک را برای هر فرم جدا گانه تعریف کنید.

یا حق ...

حامد مصافی
یک شنبه 13 خرداد 1386, 19:08 عصر
در برنامه ی فعلی ام به این موضوع نیاز پیدا کردم
به همین دلیل نسخه کلاس اون رو نوشتم
امیدوارم مشکل شما رو هم حل کنه