راستش من یه Class نوشتم برای Register کردن کلید ها اما کار نمیکنه میشه ببینید مشکلش چیه
Cls_HotKey.rar
راستش من یه Class نوشتم برای Register کردن کلید ها اما کار نمیکنه میشه ببینید مشکلش چیه
Cls_HotKey.rar
هیچکی نیست با این تابع Api کار کرده باشه
حداقل یه روش برای درست کردن SHortCut بگید
یه کامپوننت به زبان دلفی نوشته بودم که کار می کنه ببین مشکل کدت کجاست ....
یا حق ...
جناب Hamid_PaK دستت درد نکنه اما چون Delphi کارنکردم اصلا نفهمیدم که این کد چجوری هستش اگه میشه با VB یا #C توضیح بدی
متشکرم
راستش من هنوز مشکلم حل نشده خیلی هم ضروری هستش اگه میشه یه کمکی بکنید
به این کد یه نگاهی بیاندازید ...
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 تبدیل کنید ...
یا حق ...
جناب Hamid_PaK متشکرم به خاطر وقتی که گذاشتید
راستش من این دو رو چک کردم عین هم بودن از لحاظ منطقی نباید مشکلی داشته باشه نمیدونم چرا این طوری شده
مشکل اینه که اجرا میشه و کلید مربوطه رو ریجستر میکنه اما تابع
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که مربوط به این هستش که هر دفعه چک کنه که کلید زده شده یا نه رو اصلا اجرا نمیکنه
البته این تابع داخل خود کلاس تعریف شده
سلام دوست عزیز
یک مثال برات نوشتم.
ببینش
آخرین ویرایش به وسیله حامد مصافی : پنج شنبه 26 اردیبهشت 1387 در 13:48 عصر
جناب BlackDal متشکرم - من میخواستم که اگه میشه یه طوری بشه که مجبور نباشم توی هر فرم این کد رو بنویسم آخه میخوام توی هر فرم کلید های مربوط به خودش ست بشه
مشکلم با یه فایل Dll حل شد این فایل رو که از CodeProject دانلود کردم رو توی برنامه در حالتی میتونم استفاده کنم که توی هر فرم فقط یه HotKey باشه اما اگه خواسته باشم که توی هر فرم چند hotKey داشته باشم نمیدونم چیکار باید بکنم اگه میشه ببینید میشه هیچکارش کرد
این هم فایل Dll
MCLHotkey.rar
متشکرم
این که کجا باشه اهمیتی نداره ، کجای برنامه این تابع را برای بازرسی پیغامها فعال می کنید ؟؟؟
مثال :
constructor THotKeyManager.Create(AOwner: TComponent);
begin
FHotKeys:= THotKeyCollection.Create(Self);
inherited Create(AOwner);
if not (csDesigning in ComponentState) then
Application.HookMainWindow(WMHotKey);
end;
باید تابع هوک را برای هر فرم جدا گانه تعریف کنید.
یا حق ...
در برنامه ی فعلی ام به این موضوع نیاز پیدا کردم
به همین دلیل نسخه کلاس اون رو نوشتم
امیدوارم مشکل شما رو هم حل کنه
آخرین ویرایش به وسیله حامد مصافی : پنج شنبه 26 اردیبهشت 1387 در 13:48 عصر