PDA

View Full Version : تشخیص کلیک روی یک پنجره دیگر



houshmand
سه شنبه 28 مرداد 1382, 21:01 عصر
:?: چگونه می توان Click شدن یک دکمه روی یک پنجره دیگر را که شماره هندل دکمه آن را داریم تشخیص داد؟(یا کار های مشابه)

1-اگر بخواهیم روال عادی آن اجرا نشود چه کار کنیم؟
2- اگر بخواهیم روال ما+روال عادی اجرا بشود چه کار کنیم؟

با تشکر

Kambiz
جمعه 31 مرداد 1382, 03:35 صبح
راهنماییش با من نوشتنش با شما، قبول؟ :wink:

باید WindowProc مربوط به Parent کلید رو با مال خودتون عوض کنید. هر وقت در این WindowProc جدید WM_COMMAND دریافت شد که <span dir=ltr>HiWord(wParam)</span> اون برابر BN_CLICKED و lParam هم برابر با Handle کلید بود٬ معنی اون اینه که کلید فشرده شده. حالا اینجا می‌تونید کد دلخواه خودتون رو اجرا کنید یا اینکه اجازه بدید تا WindowProc اصلی پیام رو پردازش بکنه.

houshmand
جمعه 07 شهریور 1382, 15:37 عصر
باتشکر
من هر کاری کردم نتوانستم WindowProc قبلی برنامه را صدا بزنم
من این برنامه را سعی کردم به کمک راهنمای Windows SDK بنویسم لطفاً بگویید که چه اشتباه(هایی) کردم؟ :roll:


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class&#40;TForm&#41;
Button1&#58; TButton;
procedure FormClose&#40;Sender&#58; TObject; var Action&#58; TCloseAction&#41;;
procedure FormCreate&#40;Sender&#58; TObject&#41;;
end;

var
Form1&#58; TForm1;
p&#58;Longint;
implementation

&#123;$R *.DFM&#125;
function test&#40;hwnd&#58;HWND;uMsg&#58;Longint;WPARAM&#58;WPARAM ; LPARAM &#58; LPARAM&#41;&#58;Longint ;
begin
result&#58;= CallWindowProc&#40;pointer&#40;p&#41;,hwnd,uMsg,WPARAM,LPARAM&#41; ;
end;

procedure TForm1.FormClose&#40;Sender&#58; TObject; var Action&#58; TCloseAction&#41;;
begin
SetWindowLong&#40;Button1.Handle,GWL_WNDPROC,p&#41;;
end;

procedure TForm1.FormCreate&#40;Sender&#58; TObject&#41;;
begin
p&#58;=GetWindowLong&#40;Button1.Handle,GWL_WNDPROC&#41;;
SetWindowLong&#40;Button1.Handle,GWL_WNDPROC,longInt&#40;@ test&#41;&#41;;

end;

end.

(متشکرم) :oops:

Kambiz
جمعه 07 شهریور 1382, 20:11 عصر
WndProc جدید و در کل تمام توابع و Callbackهای ویندوز را باید با فراخوانی stdcall تعریف کنید.

function test&#40;hwnd&#58;HWND;uMsg&#58;Longint;WPARAM&#58;WPARAM ; LPARAM &#58; LPARAM&#41;&#58;Longint ; stdcall;
begin
result&#58;= CallWindowProc&#40;pointer&#40;p&#41;,hwnd,uMsg,WPARAM,LPARAM&#41; ;
end;