نمایش نتایج 1 تا 14 از 14

نام تاپیک: یه مشکل در استفاده از RegisterHotKey

  1. #1
    کاربر دائمی آواتار h_sadeghynejad
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    Ariayee Land
    پست
    190

    یه مشکل در استفاده از RegisterHotKey

    راستش من یه Class نوشتم برای Register کردن کلید ها اما کار نمیکنه میشه ببینید مشکلش چیه
    Cls_HotKey.rar

  2. #2
    کاربر دائمی آواتار h_sadeghynejad
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    Ariayee Land
    پست
    190
    هیچکی نیست با این تابع Api کار کرده باشه
    حداقل یه روش برای درست کردن SHortCut بگید

  3. #3
    کاربر دائمی آواتار h_sadeghynejad
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    Ariayee Land
    پست
    190
    هیچکس نیست یه جوابی به من بده

  4. #4
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    یه کامپوننت به زبان دلفی نوشته بودم که کار می کنه ببین مشکل کدت کجاست ....

    یا حق ...
    فایل های ضمیمه فایل های ضمیمه

  5. #5
    کاربر دائمی آواتار h_sadeghynejad
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    Ariayee Land
    پست
    190
    جناب Hamid_PaK دستت درد نکنه اما چون Delphi کارنکردم اصلا نفهمیدم که این کد چجوری هستش اگه میشه با VB یا #C توضیح بدی
    متشکرم

  6. #6
    کاربر دائمی آواتار h_sadeghynejad
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    Ariayee Land
    پست
    190
    راستش من هنوز مشکلم حل نشده خیلی هم ضروری هستش اگه میشه یه کمکی بکنید

  7. #7
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    به این کد یه نگاهی بیاندازید ...

    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 تبدیل کنید ...

    یا حق ...

  8. #8
    کاربر دائمی آواتار h_sadeghynejad
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    Ariayee Land
    پست
    190
    جناب Hamid_PaK متشکرم به خاطر وقتی که گذاشتید
    راستش من این دو رو چک کردم عین هم بودن از لحاظ منطقی نباید مشکلی داشته باشه نمیدونم چرا این طوری شده

  9. #9
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    مشکل کجاست ؟؟؟

    یا حق ...

  10. #10
    کاربر دائمی آواتار h_sadeghynejad
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    Ariayee Land
    پست
    190
    مشکل اینه که اجرا میشه و کلید مربوطه رو ریجستر میکنه اما تابع
    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. #11

  12. #12
    کاربر دائمی آواتار h_sadeghynejad
    تاریخ عضویت
    بهمن 1385
    محل زندگی
    Ariayee Land
    پست
    190
    جناب BlackDal متشکرم - من میخواستم که اگه میشه یه طوری بشه که مجبور نباشم توی هر فرم این کد رو بنویسم آخه میخوام توی هر فرم کلید های مربوط به خودش ست بشه
    مشکلم با یه فایل Dll حل شد این فایل رو که از CodeProject دانلود کردم رو توی برنامه در حالتی میتونم استفاده کنم که توی هر فرم فقط یه HotKey باشه اما اگه خواسته باشم که توی هر فرم چند hotKey داشته باشم نمیدونم چیکار باید بکنم اگه میشه ببینید میشه هیچکارش کرد
    این هم فایل Dll
    MCLHotkey.rar
    متشکرم

  13. #13
    کاربر دائمی آواتار Hamid_PaK
    تاریخ عضویت
    تیر 1384
    محل زندگی
    تهران
    پست
    1,125
    این که کجا باشه اهمیتی نداره ، کجای برنامه این تابع را برای بازرسی پیغامها فعال می کنید ؟؟؟
    مثال :
    constructor THotKeyManager.Create(AOwner: TComponent);
    begin
    FHotKeys:= THotKeyCollection.Create(Self);
    inherited Create(AOwner);
    if not (csDesigning in ComponentState) then
    Application.HookMainWindow(WMHotKey);
    end;

    باید تابع هوک را برای هر فرم جدا گانه تعریف کنید.

    یا حق ...

  14. #14
    در برنامه ی فعلی ام به این موضوع نیاز پیدا کردم
    به همین دلیل نسخه کلاس اون رو نوشتم
    امیدوارم مشکل شما رو هم حل کنه

تاپیک های مشابه

  1. تابع RegisterHotKey در سی شارپ
    نوشته شده توسط محمد میرمصطفی در بخش C#‎‎
    پاسخ: 4
    آخرین پست: سه شنبه 11 اسفند 1383, 23:52 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •