مشاهدة النسخة كاملة : تعطيل/ تشغيل زر قائمة إبدا StartButton
delphi4ever
12-04-2008, 09:28 PM
السلام عليكم ورحمة الله
مثال بسيط للمبتدئين حول تعطيل عمل زر القائمة إبدأ وإعادة تشغيله.
لتعطيله:
EnableWindow(FindWindowEx(FindWindow('Shell_TrayWn d', nil),
0, 'Button', nil), false);
لــتشغيله:
EnableWindow(FindWindowEx(FindWindow('Shell_TrayWn d', nil),
0, 'Button', nil), true);
والسورس في المرفقات
بالتـــوفيق:D
bilgads
14-04-2008, 10:21 AM
شكرا لك اخي
لدي مثال آخر وهو لاخفاء وإظهار ايقونات سطح المكتب
اخفاء
ShowWindow(FindWindow(nil, 'Program Manager'), SW_Hide);
إظهار
ShowWindow(FindWindow(nil, 'Program Manager'), SW_Show);
nabilkeb
11-09-2009, 12:32 AM
كود تعطيل و تشغيل زر إبدأ فعال مع الماوس ، لكن إذا استعملنا الزر الخاص به على لوحة المفاتيح نجده يعمل عادي.
هل من طريقة لتعطيل هذا الأخير ؟
nabilkeb
11-09-2009, 03:34 AM
و الله يا إخوان تعبت من البحث ، من غير فائدة .
هناك ما يسمى بــ Virtual Key (موجود بالهالب للدلفي)
عندما نريد مثلا : في EDit1 عند الضغط على زر Enter ينتقل المؤشر إلى EDit2 نكتب هذا الكود في الحدث OnKeyPress للــ EDit1
if Key=#13 then edit2.setfocus;
#13 يعوض Vk_Return ، يعني نفس النتيجة لو كتبنا هذا الكود في الحدث OnKeyDown للــ Edit1
if key=vk_return then edit2.setfocus;
- أيضا من الكود الخاص باجبار Edit1 من قبول الأرقام فقط نكتب :
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if Not (Key in ['0'..'9' ]) then begin
Key := #0; Beep;
end; - الآن : الكود الخاص بــ الزر إبدأ هو : VK_LWIN أو VK_RWIN ، الأيسر و الأيمن L و R
مبدئيا نريد عندما نضغط على زر ابدأ لا يعمل أي زر (انعدام النتيجة) يعني نحصل على Key := #0
يعني :
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (key=VK_LWIN) or(key=VK_RWIN)
then
key:=#0
end; لكن هذا الكود خاطئ ، لا بد من كتابة 0# على شكل Vertual Key.
بعبارة أخرى : السؤال : إذا كان 13# يعوض Vk_Return ، ماذا يقابل : 0# ؟
في انتظار المسـاعــــدة جزاكم الله خيرا .....
MjIrIm
12-09-2009, 03:00 AM
في البداية السلام عليكم
ماذا يقابل : 0#
تلك القيمة تلغي المفتاح المكتوب
بالرجوع الى Virtual Key Codes
ليس لها بمقابل و الله أعلم
hxxp://msdn.microsoft.com/en-us/library/aa926323.aspx
hxxp://msdn.microsoft.com/en-us/library/ms645540(VS.85).aspx
hxxp://delphi.about.com/od/objectpascalide/l/blvkc.htm
المهم تفكيرك سليم أخي العزيز nabilkeb
و السلام.
nabilkeb
12-09-2009, 03:41 AM
رغم هذا الخمول الذي يعانيه الإخوة بالمنتدى في هذا الشهر المبارك الذي من المفروض أن يكون شهر الجد العمل ، فأنـــــا أشكرك جزيل الشكر أخي على المشاركة و المبادرة ، بارك الله فيك.
- هذا أو ذاك ، إذا كان ليس لها بديلا ، يبقى السؤال مطروحـــا:
كيف يتم تعطيل زر قائمة ابدأ الخاصة بلوحة المفاتيح؟
kachwahed
13-09-2009, 01:32 PM
السلام عليكم
أخي نبيل، مبدئيا هذا الكود ينفع مع إصدارات ويندوز 9x و ME وليس له أي تأثير في الإصدارات: Windows 9x/NT 4.0/2000/ME/XP
var
i: Integer;
begin
SystemParametersInfo(SPI_SETFASTTASKSWITCH, 1, @i, 0);
لأن اختصارات النظام مثل زر WIN و ALT+ESC وغيرها مفعلة دوما ومحمية من قبل النظام، ولا يمكنك إنشاؤها كاختصارات لبرنامجك...لكن
ليس هناك مستحيل في البرمجة...
يمكن عمل Hook لتعطيل الزر WIN.
Thomas Stutz قام بعمل ذلك، إليك المشروع في كود واحد:
{********** Begin WHookDef.dpr **************}
{ Interface unit for use with WINHOOK.DLL }
unit WHookDef;
interface
uses
Windows;
function SetHook(WinHandle: HWND; MsgToSend: Integer): Boolean; stdcall;
function FreeHook: Boolean; stdcall;
implementation
function SetHook; external 'WINHOOK.DLL' Index 1;
function FreeHook; external 'WINHOOK.DLL' Index 2;
end.
{********** End WHookDef.dpr **************}
{********** Begin Winhook.dpr **************}
{ The project file }
{ WINHOOK.dll }
library Winhook;
uses
WHookInt in 'Whookint.pas';
exports
SetHook index 1,
FreeHook index 2;
end.
{********** End Winhook.dpr **************}
{********** Begin WHookInt.pas **************}
unit WHookInt;
interface
uses
Windows, Messages, SysUtils;
function SetHook(WinHandle: HWND; MsgToSend: Integer): Boolean; stdcall; export;
function FreeHook: Boolean; stdcall; export;
function MsgFilterFunc(Code: Integer; wParam, lParam: Longint): Longint stdcall; export;
implementation
// Memory map file stuff
{
The CreateFileMapping function creates unnamed file-mapping object
for the specified file.
}
function CreateMMF(Name: string; Size: Integer): THandle;
begin
Result := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, Size, PChar(Name));
if Result <> 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
CloseHandle(Result);
Result := 0;
end;
end;
end;
{ The OpenFileMapping function opens a named file-mapping object. }
function OpenMMF(Name: string): THandle;
begin
Result := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(Name));
// The return value is an open handle to the specified file-mapping object.
end;
{
The MapViewOfFile function maps a view of a file into
the address space of the calling process.
}
function MapMMF(MMFHandle: THandle): Pointer;
begin
Result := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
end;
{
The UnmapViewOfFile function unmaps a mapped view of a file
from the calling process's address space.
}
function UnMapMMF(P: Pointer): Boolean;
begin
Result := UnmapViewOfFile(P);
end;
function CloseMMF(MMFHandle: THandle): Boolean;
begin
Result := CloseHandle(MMFHandle);
end;
// Actual hook stuff
type
TPMsg = ^TMsg;
const
VK_D = $44;
VK_E = $45;
VK_F = $46;
VK_M = $4D;
VK_R = $52;
MMFName = 'MsgFilterHookDemo';
type
PMMFData = ^TMMFData;
TMMFData = record
NextHook: HHOOK;
WinHandle: HWND;
MsgToSend: Integer;
end;
// global variables, only valid in the process which installs the hook.
var
MMFHandle: THandle;
MMFData: PMMFData;
function UnMapAndCloseMMF: Boolean;
begin
Result := False;
if UnMapMMF(MMFData) then
begin
MMFData := nil;
if CloseMMF(MMFHandle) then
begin
MMFHandle := 0;
Result := True;
end;
end;
end;
{
The SetWindowsHookEx function installs an application-defined
hook procedure into a hook chain.
WH_GETMESSAGE Installs a hook procedure that monitors messages
posted to a message queue.
For more information, see the GetMsgProc hook procedure.
}
function SetHook(WinHandle: HWND; MsgToSend: Integer): Boolean; stdcall;
begin
Result := False;
if (MMFData = nil) and (MMFHandle = 0) then
begin
MMFHandle := CreateMMF(MMFName, SizeOf(TMMFData));
if MMFHandle <> 0 then
begin
MMFData := MapMMF(MMFHandle);
if MMFData <> nil then
begin
MMFData.WinHandle := WinHandle;
MMFData.MsgToSend := MsgToSend;
MMFData.NextHook := SetWindowsHookEx(WH_GETMESSAGE, MsgFilterFunc, HInstance, 0);
if MMFData.NextHook = 0 then
UnMapAndCloseMMF
else
Result := True;
end
else
begin
CloseMMF(MMFHandle);
MMFHandle := 0;
end;
end;
end;
end;
{
The UnhookWindowsHookEx function removes the hook procedure installed
in a hook chain by the SetWindowsHookEx function.
}
function FreeHook: Boolean; stdcall;
begin
Result := False;
if (MMFData <> nil) and (MMFHandle <> 0) then
if UnHookWindowsHookEx(MMFData^.NextHook) then
Result := UnMapAndCloseMMF;
end;
(*
GetMsgProc(
nCode: Integer; {the hook code}
wParam: WPARAM; {message removal flag}
lParam: LPARAM {a pointer to a TMsg structure}
): LRESULT; {this function should always return zero}
{ See help on ==> GetMsgProc}
*)
function MsgFilterFunc(Code: Integer; wParam, lParam: Longint): Longint;
var
MMFHandle: THandle;
MMFData: PMMFData;
Kill: boolean;
begin
Result := 0;
MMFHandle := OpenMMF(MMFName);
if MMFHandle <> 0 then
begin
MMFData := MapMMF(MMFHandle);
if MMFData <> nil then
begin
if (Code < 0) or (wParam = PM_NOREMOVE) then
{
The CallNextHookEx function passes the hook information to the
next hook procedure in the current hook chain.
}
Result := CallNextHookEx(MMFData.NextHook, Code, wParam, lParam)
else
begin
Kill := False;
{ Examples }
with TMsg(Pointer(lParam)^) do
begin
// Kill Numbers
if (wParam >= 48) and (wParam <= 57) then Kill := True;
// Kill Tabulator
if (wParam = VK_TAB) then Kill := True;
end;
{ Example to disable all the start-Key combinations }
case TPMsg(lParam)^.message of
WM_SYSCOMMAND: // The Win Start Key (or Ctrl+ESC)
if TPMsg(lParam)^.wParam = SC_TASKLIST then Kill := True;
WM_HOTKEY:
case ((TPMsg(lParam)^.lParam and $00FF0000) shr 16) of
VK_D, // Win+D ==> Desktop
VK_E, // Win+E ==> Explorer
VK_F, // Win+F+(Ctrl) ==> Find:All (and Find: Computer)
VK_M, // Win+M ==> Minimize all
VK_R, // Win+R ==> Run program.
VK_F1, // Win+F1 ==> Windows Help
VK_PAUSE: // Win+Pause ==> Windows system properties
Kill := True;
end;
end;
if Kill then TPMsg(lParam)^.message := WM_NULL;
Result := CallNextHookEx(MMFData.NextHook, Code, wParam, lParam)
end;
UnMapMMF(MMFData);
end;
CloseMMF(MMFHandle);
end;
end;
initialization
begin
MMFHandle := 0;
MMFData := nil;
end;
finalization
FreeHook;
end.
{********** End WHookInt.pas **************}
{ *******************************************}
{ ***************** Demo ******************}
{ *******************************************}
{
** HostApp.Exe **
HostApp.dpr
|-----FrmMainU.pas
}
{********** Begin HostApp.dpr **************}
{ Project file }
program HostApp;
uses
Forms,
FrmMainU in 'FrmMainU.pas' {FrmMain};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TFrmMain, FrmMain);
Application.Run;
end.
{********** End HostApp.dpr **************}
{********** Begin FrmMainU.pas **************}
unit FrmMainU;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
const
HookDemo = 'WINHOOK.dll';
const
WM_HOOKCREATE = WM_USER + 300;
type
TFrmMain = class(TForm)
Panel1: TPanel;
BtnSetHook: TButton;
BtnClearHook: TButton;
procedure BtnSetHookClick(Sender: TObject);
procedure BtnClearHookClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FHookSet: Boolean;
procedure EnableButtons;
public
end;
var
FrmMain: TFrmMain;
function SetHook(WinHandle: HWND; MsgToSend: Integer): Boolean; stdcall;
external HookDemo;
function FreeHook: Boolean; stdcall; external HookDemo;
implementation
{$R *.DFM}
procedure TFrmMain.EnableButtons;
begin
BtnSetHook.Enabled := not FHookSet;
BtnClearHook.Enabled := FHookSet;
end;
// Start the Hook
procedure TFrmMain.BtnSetHookClick(Sender: TObject);
begin
FHookSet := LongBool(SetHook(Handle, WM_HOOKCREATE));
EnableButtons;
end;
// Stop the Hook
procedure TFrmMain.BtnClearHookClick(Sender: TObject);
begin
FHookSet := FreeHook;
EnableButtons;
BtnClearHook.Enabled := False;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
EnableButtons;
end;
end.
{********** End FrmMainU.pas **************}
من الأحسن وضع الأسئلة في قسمها حتى تعم الفائدة.
بالتوفيق.
kachwahed
13-09-2009, 03:21 PM
هناك دوما بديل باستخدام مكونات خارجية:
http://www.torry.ru/vcl/system/packs/KhUtilsD9.zip
nabilkeb
13-09-2009, 09:19 PM
بخصوص المكون عندي دلفي7
- بخصوص وضع الموضوع بقسم الأسئلة ، لم أنتبه أصلا في أي قسم هو هذا الموضوع و السبب راجع إلى أني بحثت عن الموضوع بالمنتدى فوجدت هذا فأردت أن أستزيد عليه لأنه بنفس الموضوع . عموما يمكن للإخوة القائمين على هذا الصلرح الرائع نقل الموضوع.
- أما بخصوص Hook (http://www.arabteam2000-forum.com/index.php?showtopic=56692) فأشكرك جزيلا و الشكر قليل. فعلا بهكذا طريقة يتم حل الإشكال.
و هذا المرفق امتدادا لهوك Thomas Stutz.
شكرا.
kachwahed
15-09-2009, 03:35 PM
يمكن تعديل الكود ليتوافق مع D7.
في المرفقات المكون معدل.
هناك طريقة لتعطيل عمل اختصارات WinKeys وهي:
WIN+F; WIN+D; WIN+E; WIN+R; WIN+M
بإضافة مفتاح NoWinKeys من النوع DWORD بقيمة 1 في المسار:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Curr entVersion\policies\Explorer
أعددت مثال صغير في المرفقات.
بالتوفيق.
adnaner
24-03-2011, 11:14 AM
لتغيير نص الزر ابدأ
procedure tform1.button1click(sender: Tobject);
var handle1,handle2:hwnd;
begin
handle1:=findwindow('shell_traywnd',nil); //get the handle of the taskbar
handle2:=findwindowex(handle1,0,'button',nil); //get the handle of the start button from the taskbar
setwindowtext(handle2,pansichar(edit1.text)); //set the text
sendmessage(handle2,messages.wm_mousemove,0,0); //used to refresh the caption of the start button
end
vBulletin® , Copyright ©2008-2012