[WinAPI] Brak belki i reagowanie na klawisz ESC (może kAzek będzie wiedzial)

0

Wita,

Widze, że kAzek jest aktywny, ale jak ktoś z Was będzie wiedzial to proszę o podpowiedź. Bo w sumie nie jest mi aż tak bardzo to
potrzene, ale przydalo by się wiedzieć jak to zrobić. Otóż mam taki kod jak na http://www.speedyshare.com/files/26247978/host.rar
mniejsza o to czy pewne rzeczy da się zrobić w nim inaczej. Mi chodzi o taką funkcjonalnośc aby program dalo się zamknąc wciskając
Escape, a także wciskając Enter wywoływac button czyli w głownej procedurze obslugi okna dialogowego jest między innymi taki kod

    WM_KEYDOWN :
      begin
        if wParam = VK_ESCAPE then
        begin
          SendMessage(AppHandle, WM_CLOSE, 0, 0);
        end;
        if (GetFocus = hCtlInputEdit) and (wParam = VK_RETURN)
          and (IsWindowEnabled(hCtlConvertBtn) = True) then
        begin
          SendMessage(AppHandle, WM_COMMAND, IDC_CONVERTBTN, 0);
        end;
      end;

Jednak taki kod zadziała pod warunkiem, że obsłużymy komunikaty w taki sposób jak poniżej:

var
  Msg : TMsg;
  DlgH : HWND;
begin
  DlgH := CreateDialog(hInstance, MAKEINTRESOURCE(IDC_TMAINFORM), 0, @MainDlgProc);
  ShowWindow(DlgH, SW_SHOW);
  while GetMessage(Msg, 0, 0, 0) do
  begin
    if Msg.Message = WM_KEYDOWN then
    begin
      SendMessage(AppHandle, Msg.Message, Msg.wParam, Msg.lParam);
    end;
    if IsDialogMessage(DlgH, Msg) = False then
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
  end;
end.

I teraz problem polega na tym, że chccę pozbyć się belki programu z paska start, robiłem to już w kilku progrmaach
dzięk ipodpowiedzi kAZka, ktory doradzil aby w pliku zasobów z dialogiem zastosować taki wpis, no i to działa ale w
przypadku gdy okna wywołujemy kodem pokazanym pod sam koniec posta, ni jak inaczej nie umiem się pozbyć belki
w innym przypadku. A nie chcę robić tego przez SetWindowLong, bo okno bez belki ustawione stylem wygląda - jak
dla mnie brzydko, bo ma mały pasek tytułowy oraz mały przycisk do zamykania, a także na formatce rysowane jest
czasami jakies dziwne tło. Wiadomo w VCLu nie ma problemów bo operujemy na Application.Handle. Ale jak zrobić w
WinAPI to aby dialog obsługiwal Escape, na dowolnym elemencie a jednocześnie pozbyć się belki. PRoszę o pomco.

Sposób KAzka na ukrycie belki:

IDC_TAPPFORM DIALOGEX 0 0 0 0
WS_EX_TOOLWINDOW
FONT 8, "MS Sans Serif", 400, 0
{
}

Wywoływanie w ten sposób z dodatkowym kodem który jest powyżej nie ukrywa belki, może coś robię nie tak, ale co?

function HiddenDlgProc(hWnd : HWND; uMsg, wParam, lParam : Longint) : Bool; stdcall;
begin
  Result := False;
  case uMsg of
    WM_CLOSE :
      begin
        EndDialog(hWnd, 0);
      end;
    WM_INITDIALOG :
      begin
        AppHandle := hWnd;
        ShowWindow(AppHandle, SW_HIDE);
        DialogBoxParamA(hInstance, MAKEINTRESOURCE(IDC_TMAINFORM), hWnd, @MainDlgProc, 0);
        Result := True;
      end;
  end;
end;

var
  Res : Integer;
begin
  hInstance := GetModuleHandle(nil);
  Res := DialogBoxParamA(hInstance, MAKEINTRESOURCE(IDC_TAPPFORM), 0, @HiddenDlgProc, 0);
  ExitProcess(Res);
end.
0

No to w czym problem:

function HiddenDlgProc(hWnd : HWND; uMsg, wParam, lParam : Longint) : Bool; stdcall;
var
  Msg : TMsg;
  DlgH : Dword;
begin
  Result := False;
  case uMsg of
    WM_CLOSE :
      begin
        EndDialog(hWnd, 0);
      end;
    WM_INITDIALOG :
      begin
        AppHandle := hWnd;
        ShowWindow(AppHandle, SW_HIDE);

        DlgH := CreateDialog(hInstance, MAKEINTRESOURCE(IDC_TMAINFORM), hWnd, @MainDlgProc);
        ShowWindow(DlgH, SW_SHOW);
        while GetMessage(Msg, 0, 0, 0) do
        begin
          if Msg.Message = WM_KEYDOWN then
          begin
            SendMessage(AppHandle, Msg.Message, Msg.wParam, Msg.lParam);
          end;
          if IsDialogMessage(DlgH, Msg) = False then
          begin
            TranslateMessage(Msg);
            DispatchMessage(Msg);
          end;
        end;

        Result := True;
      end;
  end;
end;

I w WM_CLOSE widocznego okna zamiast PostQuitMessage(0); daj ExitProcess(0);

0

Ah, teraz działa - już wiem gdzie był błąd trzeba w tym kodzie zamiast AppHandle podać uchwyt do drugiego okna,
czyli glownego. Oczywiście należy ten uchwyt podstawić pod zmienną globalną. I teraz jest ok. Dziękuję Ci kAzek.

          if Msg.Message = WM_KEYDOWN then
          begin
            SendMessage(DialogHandle, Msg.Message, Msg.wParam, Msg.lParam);
          end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1