私はデスクトップウィンドウへのハンドルを返す単一のきちんとした(閉じた、自己完結型の)関数(GetDesktopHandleと呼ぶ)を持っていたいと思います。私は以下のコードを使用します。しかし、それはDeskHandleでのみ動作し、グローバル変数です。EnumWindowsコールバック関数の使用方法は?
このグローバル変数を削除するにはどうすればよいですか?私はそれをローカルにする場合は、私がDeskHandleしようとすると、私はgetDesktopWndでAVを得る:= hChild
VAR DeskHandle : HWND;
function GetDesktopHandle: HWND;
function getDesktopWnd (Handle: HWND; NotUsed: Longint): bool; stdcall; { Callback function }
VAR hChild : HWND;
begin
if handle <> 0 then
begin
hChild := FindWindowEx(handle, 0, 'SHELLDLL_DefView', nil);
if hChild <> 0 then
begin
hChild := FindWindowEx(hChild, 0, 'SysListView32', nil);
if hChild <> 0
then DeskHandle := hChild;
end;
end;
Result:= TRUE;
end;
begin
DeskHandle := 0;
EnumWindows(@getDesktopWnd, 0);
Result:= DeskHandle;
end;
主な質問がある:私は、単一の関数として、このコードを書くことができますあるいは、少なくとも、私は取り除くことができます外部/グローバルvarの?
解決策:
ドキュメントには、2番目のパラメータはINパラメータにすぎないことが記載されています。
lParamに タイプ[IN]:LPARAM コールバック関数に渡されるアプリケーション定義の値。
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633497%28v=vs.85%29.aspx
戻って結果を渡すためにそれを使用するために間違っているだろうか?
デスクトップのルートを探しているすべてのトップレベルウィンドウを列挙する代わりに、 'GetShellWindow'を呼び出して直接そのウィンドウに行くことができます。次に、 'FindWindowEx'を2回使用します。 –
も参照してくださいhttp://stackoverflow.com/a/5691808/33732 –
デスクトップウィンドウハンドルを取得する既存の関数があり、[GetDesktopWindow](https://msdn.microsoft.com/en-us/library)と呼ばれています。 /windows/desktop/ms633504(v=vs.85).aspx) – Remko