PDA

View Full Version : اجرای کد کلید Enter



مجتبی جوادی
چهارشنبه 24 مرداد 1386, 18:14 عصر
دوستان سلام
من در برنامه ام نیاز دارم کد کلید Enter اجرا شود و از یک پیغام صرفه نظر کنم . اگر ممکن است راهنمایی کنید چه و کجا باید بنویسم

Valadi
چهارشنبه 24 مرداد 1386, 18:26 عصر
کد کلید اینتر 13 است

babak869
چهارشنبه 24 مرداد 1386, 19:43 عصر
از این کد میتونید استفاده کنید تا در زمان زدن کلید اینتر به عنصر بعدی برود :


Enetr Key Control
------------------------------
If Key = #13 Then Begin
If HiWord(GetKeyState(VK_SHIFT)) <> 0 then
SelectNext(Sender as TWinControl,False,True)
else
SelectNext(Sender as TWinControl,True,True);
Key := #0
end;
-----------------------------


موفق باشید

مجتبی جوادی
چهارشنبه 24 مرداد 1386, 21:00 عصر
اقای احدی سلام
ممنون از لطف شما . ولی من می خواهم کلید Enter بطور خودکار عمل کند یعنی بطور اتوماتیک پیغام ok شود
متشکرم

SYNDROME
چهارشنبه 24 مرداد 1386, 21:03 عصر
با سلام


من در برنامه ام نیاز دارم کد کلید Enter اجرا شود و از یک پیغام صرفه نظر کنم .

اگر واضختر حرفتان را بیان کنید شاید بهتر بتوانیم کمکتان کنیم
دقیقا می خواهید چه کار بکنید.
موفق باشید

dkhatibi
چهارشنبه 24 مرداد 1386, 23:04 عصر
منظورشان فکر کنم اینه که موقعی که پیامی ظاهر شد به طور خودکار دکمه ی Ok کلیک شود

مجتبی جوادی
پنج شنبه 25 مرداد 1386, 00:50 صبح
درست است آقای خطیبی دقیقا همین را می خواهم

persianboy
پنج شنبه 25 مرداد 1386, 02:12 صبح
چی شده ، تو برنامت component پولی استفاده کردی ؟ nag میده ؟
اگه اینطوریه ، خبرشو بده . هر چیزی یه راهی داره .

مجتبی جوادی
پنج شنبه 25 مرداد 1386, 10:52 صبح
درست دوست عزیز . آیا راهی داره یا نه ؟

Mohammad_Mnt
پنج شنبه 25 مرداد 1386, 13:22 عصر
از این کد استفاده کن :



{1. PostKeyEx32 function}

procedure PostKeyEx32(key: Word; const shift: TShiftState; specialkey: Boolean);
{************************************************* ***********
* Procedure PostKeyEx32
*
* Parameters:
* key : virtual keycode of the key to send. For printable
* keys this is simply the ANSI code (Ord(character)).
* shift : state of the modifier keys. This is a set, so you
* can set several of these keys (shift, control, alt,
* mouse buttons) in tandem. The TShiftState type is
* declared in the Classes Unit.
* specialkey: normally this should be False. Set it to True to
* specify a key on the numeric keypad, for example.
* Description:
* Uses keybd_event to manufacture a series of key events matching
* the passed parameters. The events go to the control with focus.
* Note that for characters key is always the upper-case version of
* the character. Sending without any modifier keys will result in
* a lower-case character, sending it with [ssShift] will result
* in an upper-case character!
************************************************** **********}
type
TShiftKeyInfo = record
shift: Byte;
vkey: Byte;
end;
byteset = set of 0..7;
const
shiftkeys: array [1..3] of TShiftKeyInfo =
((shift: Ord(ssCtrl); vkey: VK_CONTROL),
(shift: Ord(ssShift); vkey: VK_SHIFT),
(shift: Ord(ssAlt); vkey: VK_MENU));
var
flag: DWORD;
bShift: ByteSet absolute shift;
i: Integer;
begin
for i := 1 to 3 do
begin
if shiftkeys.shift in bShift then
keybd_event(shiftkeys.vkey, MapVirtualKey(shiftkeys.vkey, 0), 0, 0);
end; [I]{ For }
if specialkey then
flag := KEYEVENTF_EXTENDEDKEY
else
flag := 0;
keybd_event(key, MapvirtualKey(key, 0), flag, 0);
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0);
for i := 3 downto 1 do
begin
if shiftkeys.shift in bShift then
keybd_event(shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0),
KEYEVENTF_KEYUP, 0);
end; [I]{ For }
end; { PostKeyEx32 }

procedure TForm1.Button1Click(Sender: TObject);
begin
PostKeyEx32(VK_LWIN, [], False);
PostKeyEx32(Ord('D'), [], False);
PostKeyEx32(Ord('C'), [ssctrl, ssAlt], False);
end;
{************************************************* ***********}
{2. With keybd_event API}

procedure TForm1.Button1Click(Sender: TObject);
begin
[I]{or you can also try this simple example to send any
amount of keystrokes at the same time. }
{Pressing the A Key and showing it in the Edit1.Text}
Edit1.SetFocus;
keybd_event(VK_SHIFT, 0, 0, 0);
keybd_event(Ord('A'), 0, 0, 0);
keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
{Presses the Left Window Key and starts the Run}
keybd_event(VK_LWIN, 0, 0, 0);
keybd_event(Ord('R'), 0, 0, 0);
keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0);
end;
{************************************************* **********}
{3. With keybd_event API}

procedure PostKeyExHWND(hWindow: HWnd; key: Word; const shift: TShiftState;
specialkey: Boolean);
{************************************************* ***********
* Procedure PostKeyEx
*
* Parameters:
* hWindow: target window to be send the keystroke
[I] * key : virtual keycode of the key to send. For printable
* keys this is simply the ANSI code (Ord(character)).
* shift : state of the modifier keys. This is a set, so you
* can set several of these keys (shift, control, alt,
* mouse buttons) in tandem. The TShiftState type is
* declared in the Classes Unit.
* specialkey: normally this should be False. Set it to True to
* specify a key on the numeric keypad, for example.
* If this parameter is true, bit 24 of the lparam for
* the posted WM_KEY* messages will be set.
* Description:
* This
procedure sets up Windows key state array to correctly
* reflect the requested pattern of modifier keys and then posts
* a WM_KEYDOWN/WM_KEYUP message pair to the target window. Then
* Application.ProcessMessages is called to process the messages
* before the keyboard state is restored.
* Error Conditions:
* May fail due to lack of memory for the two key state buffers.
* Will raise an exception in this case.
* NOTE:
* Setting the keyboard state will not work across applications
* running in different memory spaces on Win32 unless AttachThreadInput
* is used to connect to the target thread first.
*Created: 02/21/96 16:39:00 by P. Below
************************************************** **********}
type
TBuffers = array [0..1] of TKeyboardState;
var
pKeyBuffers: ^TBuffers;
lParam: LongInt;
begin
(* check if the target window exists *)
if IsWindow(hWindow) then
begin
(* set local variables to default values *)
pKeyBuffers := nil;
lParam := MakeLong(0, MapVirtualKey(key, 0));
(* modify lparam if special key requested *)
if specialkey then
lParam := lParam or $1000000;
(* allocate space for the key state buffers *)
New(pKeyBuffers);
try
(* Fill buffer 1 with current state so we can later restore it.
Null out buffer 0 to get a "no key pressed" state. *)
GetKeyboardState(pKeyBuffers^[1]);
FillChar(pKeyBuffers^[0], SizeOf(TKeyboardState), 0);
(* set the requested modifier keys to "down" state in the buffer*)
if ssShift in shift then
pKeyBuffers^[0][VK_SHIFT] := $80;
if ssAlt in shift then
begin
(* Alt needs special treatment since a bit in lparam needs also be set *)
pKeyBuffers^[0][VK_MENU] := $80;
lParam := lParam or $20000000;
end;
if ssCtrl in shift then
pKeyBuffers^[0][VK_CONTROL] := $80;
if ssLeft in shift then
pKeyBuffers^[0][VK_LBUTTON] := $80;
if ssRight in shift then
pKeyBuffers^[0][VK_RBUTTON] := $80;
if ssMiddle in shift then
pKeyBuffers^[0][VK_MBUTTON] := $80;
(* make out new key state array the active key state map *)
SetKeyboardState(pKeyBuffers^[0]);
(* post the key messages *)
if ssAlt in Shift then
begin
PostMessage(hWindow, WM_SYSKEYDOWN, key, lParam);
PostMessage(hWindow, WM_SYSKEYUP, key, lParam or $C0000000);
end
else
begin
PostMessage(hWindow, WM_KEYDOWN, key, lParam);
PostMessage(hWindow, WM_KEYUP, key, lParam or $C0000000);
end;
(* process the messages *)
Application.ProcessMessages;
(* restore the old key state map *)
SetKeyboardState(pKeyBuffers^[1]);
finally
(* free the memory for the key state buffers *)
if pKeyBuffers <> nil then
Dispose(pKeyBuffers);
end; { If }
end;
end; { PostKeyEx }

procedure TForm1.Button1Click(Sender: TObject);
var
targetWnd: HWND;
begin
targetWnd := FindWindow('notepad', nil)
if targetWnd <> 0 then
begin
PostKeyExHWND(targetWnd, Ord('I'), [ssAlt], False);
end;
end;
{************************************************* **********}
{3. With SendInput API}

procedure TForm1.Button1Click(Sender: TObject);
const
Str: string = 'writing writing writing';
var
Inp: TInput;
I: Integer;
begin
Edit1.SetFocus;
for I := 1 to Length(Str) do
begin
Inp.Itype := INPUT_KEYBOARD;
Inp.ki.wVk := Ord(UpCase(Str[i]));
Inp.ki.dwFlags := 0;
SendInput(1, Inp, SizeOf(Inp));
Inp.Itype := INPUT_KEYBOARD;
Inp.ki.wVk := Ord(UpCase(Str[i]));
Inp.ki.dwFlags := KEYEVENTF_KEYUP;
SendInput(1, Inp, SizeOf(Inp));
Application.ProcessMessages;
Sleep(80);
end;
end;

procedure SendAltTab;
var
KeyInputs: array of TInput;
KeyInputCount: Integer;

procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
Inc(KeyInputCount);
SetLength(KeyInputs, KeyInputCount);
KeyInputs[KeyInputCount - 1].Itype := INPUT_KEYBOARD;
with KeyInputs[KeyInputCount - 1].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags := KEYEVENTF_EXTENDEDKEY;
dwFlags := Flags or dwFlags;
time := 0;
dwExtraInfo := 0;
end;
end;
begin
KeybdInput(VK_MENU, 0); // Alt
KeybdInput(VK_TAB, 0); // Tab
KeybdInput(VK_TAB, KEYEVENTF_KEYUP); // Tab
KeybdInput(VK_MENU, KEYEVENTF_KEYUP); // Alt
SendInput(KeyInputCount, KeyInputs[0], SizeOf(KeyInputs[0]));
end;








پ.ن : منبع (http://www.delphitricks.com/source-code/windows/simulate_the_pressing_of_keyboard_keys.html)

persianboy
پنج شنبه 25 مرداد 1386, 13:49 عصر
اگه نظر دوستمون کاری نتونست انجام بده ، کامپوننت رو آپلود کن ببینیم چه میشه کرد .

مجتبی جوادی
پنج شنبه 25 مرداد 1386, 14:37 عصر
آقا محمد ممنون
ولی اگه میشه توضیح بدهید کجا و چگونه از آن استفاده کنم

Hamid.Kad
پنج شنبه 25 مرداد 1386, 15:18 عصر
دوست عزیز تا زمانیکه شما پیغام را OK نکنید هیچ دستوری اجرا نمیشه مگر اینکه در برنامه از Thread یا عناصری مثل TTimer استفاده کرده باشید. پس بهتره برای حل این مشکل مثلاً از یک TTimer استفاده کنید و در وقت مقتضی دستور فشرده شدن کلید Enter رو که کد اون رو دوستان نوشتند در OnTimer اون اجرا کنید

persianboy
پنج شنبه 25 مرداد 1386, 16:15 عصر
آقا جون این کار ها یه خورده دردسر داره ،شما آدرس کامپوننت بذار ، اگه حل نشد ، اونوقت این کارها رو انجام بده .
یا لااقل اسمشو بگو .

مجتبی جوادی
جمعه 26 مرداد 1386, 02:41 صبح
دوست عزیز آپلود کردن آن زمان زیادی می گیرد ولی اسم آن CAD Impoert VCL است وآدرس آن www.cadsofttools.com میباشد
متشکرم

مجتبی جوادی
دوشنبه 29 مرداد 1386, 00:38 صبح
آقا محمد لطفا بفرمایید از کد مذکور چگونه و کجا استفاده کنم
با تشکر

persianboy
دوشنبه 29 مرداد 1386, 15:19 عصر
من این کامپوننت رو دانلود کردم ، هیچ مشکلی نداره ، هیچ اروری نمیده ، نمیدونم چطور میگی
nag میده .

seyed_farid
دوشنبه 29 مرداد 1386, 23:33 عصر
من از این کد استفاده میکنم.
یک تایمر رو فرم بذار.

procedure TForm2.Timer1Timer(Sender: TObject);
begin

if PostMessage(FindWindow(nil,pchar('Warning')),wm_Cl ose,0,0)
then
begin
Timer1.Enabled:=false;
self.Destroy;
end;

end;

مجتبی جوادی
چهارشنبه 31 مرداد 1386, 01:08 صبح
آقا فرید ممنون ولی من وقتی روی فرم یک تایمر قرار می دهم و کد زیر را می نویسم برنامه ام بلافاصله بهد از اجرا قطع می شود .
در ضمن آقای Persianboy شما آیا روی فایلهای اتوکد آن را اجرا کرده اید ؟

مجتبی جوادی
جمعه 02 شهریور 1386, 00:14 صبح
آقای Persianboy کامپوننت را در مورد فایهای اتوکد تست کردید ؟ میشود لطفا نتیجه را بفرمایید که آیا می شود آن پیغام را برداشت یا نه ؟
آقا فرید شما هم نفرمودید وقتی من تایمر روی فرم می گذارم ، فرم بسته میشود ، چه کار باید کرد ؟
متشکرم

persianboy
جمعه 02 شهریور 1386, 00:34 صبح
شرمنده ، تا حالا با اتوکد کار نکردم . فقط میدونم واسه نقشه کشیه . من فایل اتو کد ندارم . پسوندشون چیه ؟
اگه یه دونشونو آپلود کنی که خیلی خوب میشه .

مجتبی جوادی
شنبه 10 شهریور 1386, 00:01 صبح
سلام
آقای Persianboy کامپوننت را در مورد فایهای اتوکد تست کردید یا نه ؟

seyed_farid
شنبه 10 شهریور 1386, 00:40 صبح
آقا فرید ممنون ولی من وقتی روی فرم یک تایمر قرار می دهم و کد زیر را می نویسم برنامه ام بلافاصله بهد از اجرا قطع می شود .

دوست عزیز فرم اصلی برنامه رو فقط این تایمر روش بذار . تو دستورات من بعد از ارسال کلید بستن پنجره باز شده که عنوان آن هم warning است فرم اول رو نابود میکنم و فرم بعدی بعنوان فرم اصلی میشه و شما باید فرم اصلی برنامت رو فرم دوم محسوب کنی.:بوس:

Will_Smith
شنبه 10 شهریور 1386, 12:39 عصر
آقای بابک خان چرا از اول تا آخرش رو تشکر زده؟؟؟؟

مجتبی جوادی
یک شنبه 11 شهریور 1386, 19:54 عصر
أقا فرید متاسفانه من متوجه منظورتان نشدم ولی درباره برنامه ام کمی توضیح می دهم :
برنامه من فقط یک فرم دارد . درون این فرم یک dbgrid وجود دارد که به یک دیتابیس که همان بانک نقشه های من میباشد متصل است . حال برنامه را طوری تنظیم کرده ام که وقتی روی هر رکورد (روی هر نقشه) کلیک می کنم ، آن نقشه روی صفحه ظاهر می شود که یک سری عملیات روی آن انجام می شود البته این عملیات ها به مشکل ما ربطی ندارد . حال این خطا زمانی ظاهر می شود که روی هر رکورد کلیک می کنم و تا وقتی که پیغام خطا را ok نکنم نقشه باز نمی شود . حالا چگونه می شود آن پیغام خطا را حذف و یا بطور اتوماتیک تایید کرد.
امیدوارم منظورم را رسانده باشم
با تشکر

seyed_farid
چهارشنبه 14 شهریور 1386, 22:55 عصر
دوست عزیز ، شما یک تایمر بزار رو فرم و دستورات تایمری که نوشتم رو بدون Self.destroy بنویس. بعد این تایمر رو تو کلیک نقشه Enabel کن . ضمنا شما باید اول بدونید که اون پیام که میاد عنوانش چیه و بجای کلمه Warning که من تو کد داشتم بذاری. با این کار تایمر با پیدا کردن اون پنجره سریعا اونو میبنده و خودش رو هم Disable میکنه. زمان تایمر رو هم هر چه کمتر بذاری سریعتر میتونه ببنددش.

مجتبی جوادی
پنج شنبه 15 شهریور 1386, 00:55 صبح
آقا فرید من همان کاری که گفتید کردم ولی باز هم آن پیغام ظاهر شد

مجتبی جوادی
پنج شنبه 12 اردیبهشت 1387, 02:44 صبح
دوستان سلام
ببخشید من دوباره نیاز دارم که این مشکلم حل بشه . لطفا راهنمایی کنید .
آقای احدی اگر ممکن است بفرمایید کد مورد نظر را کجا و چطور بکار ببرم ؟
با تشکر از لطف دوستان

artmissoft
جمعه 13 اردیبهشت 1387, 09:47 صبح
دوست گرامی با این راه حل ها که دوستان گفتند تاحالا باید مشکلتون حل میشود ولی اگر به کدی نیاز دارین که کلید enter رو بزنه از این کد استفاده کنید keybd_event(13,0,0,0)
البته این نکته رو هم به یاد داشته باشید که استفاده از این روش باعث ایجاد مشکل میشه چون مثلا وقتی روی my computer یا ... برید کلید enter بر اساس تایمر تعریف شده زده میشه و پنجره بلاز میشه و ...