Q:

How to select only NotebookObjects that are referring to ordinary notebooks? (not palettes etc.)

There is of course function 
Notebooks[]

But, unfortunatelly it hasn't got useful options in this context.
My question is how to pick Notebooks excluding:

Help, 
Palettes,
Packages,
Messages,
Text notebooks.

Parsing Notebook/CellInformation functions, I've found Patterns, e.g.:
ClearAttributes[Developer`CellInformation, ReadProtected]
DownValues @ Developer`CellInformation

[...]  (_FrontEnd`SelectedNotebook | _FrontEnd`InputNotebook | 
 _FrontEnd`ButtonNotebook | _FrontEnd`EvaluationNotebook | 
 _FrontEnd`MessagesNotebook | _FrontEnd`HelpBrowserNotebook | 
 _FrontEnd`ClipboardNotebook) | (_CellObject | _FrontEnd`CellObject) [...]

Those patterns seem to be what I need but I've not managed to use them. Any tips or another solution?

A:

I think the information given by AbsoluteOptions will be enough to distinguish one type of Notebook from another.
To investigate the differences among the option values of different Notebooks, we first prepare all six types of Notebooks:
nblist = Complement[Notebooks[], {EvaluationNotebook[]}]

Then we extract all of their AbsoluteOptions, and delete those which are the same among different types of Notebooks.
Then we count the (rescaled) commonness of the option values. e.g. Option CellLabelAutoDelete has value True for Message, Package, Text, Palette and ordinary Notebook, but False for Help windows, so the commonness of CellLabelAutoDelete for Message, Package, Text, Palette, ordinary Notebook and Help will be MapAt[Rescale, Tally[{True, True, True, True, True, False}]\[Transpose], 2]\[Transpose], which is {{True, 1}, {False, 0}}. i.e. the more common the value of an option is, the more the commonness of the option approaches 1. By counting the commonness, we can identify the most unique options a Notebook type has.
nboptSet = AbsoluteOptions /@ nblist;
nbopts = nboptSet // Flatten // #[[All, 1]] & // Union;
optdataRules = DeleteCases[
      {#, MapAt[Rescale, Tally[# /. nboptSet]\[Transpose], 2]\[Transpose]} & /@ nbopts,
      {_, {{__}}}, 1]\[Transpose] //
    MapAt[Map[Rule @@ # &, #, {2}] &, #, 2] & //
   SortBy[#, First] &;

At last we plot out the chart:
MapThread[#1 /. #2 &, {optdataRules[[1]] /. #, optdataRules[[2]]}] & /@ nboptSet //
    Map[Item["", Background -> GrayLevel[# + .8]] &, #, {2}] & //
   Prepend[#, optdataRules[[1]]] & //
  Prepend[#\[Transpose], {"", "Msg", "Pkg", "Txt", "Plt", "ONb", "Hlp"}] & //
 Grid[#, Frame -> All, Alignment -> Left, FrameStyle -> GrayLevel[.7]] &

Now it's clear to see that CellInsertionPointCell is (one of) the perfect "fingerprint" of ordinary Notebook-s. So the filter function is simple:
Pick[#,
   (CellInsertionPointCell /. AbsoluteOptions[#, CellInsertionPointCell]) =!= None & /@ #
   ] & @ Notebooks[]

A:

I don't know any neat answer but here's one that works for me at the moment.

How we can detect Help, Text, Package type notebooks:
"DocumentType" /. NotebookInformation /@ Notebooks[]

{"Notebook", "Notebook", "Notebook", "Help", "Package", "Text", "Notebook",
"Notebook", "Notebook", "Notebook"}

Message is the only one with no external "StyleDefinitions":
{#, "StyleDefinitions" /. NotebookInformation[#]} & /@ Notebooks[]

In fact this method could help further, but people often change things in styles so I do not trust it. Let's:
... find Palettes using FrontEndTokens (list of tokens), with a support of  answer on MathGroup by John Fultz:
FE`Evaluate[FEPrivate`GetPopupList["MenuListPaletteWindows"]]

So at the end I'm using:
Composition[
 Complement[#, FE`Evaluate[FEPrivate`GetPopupList["MenuListPaletteWindows"]][[;;,1]]] &,
 DeleteCases[#, {_, {"Text" | "Help" | "Package", _}} | {_, {_, None}}, 1][[;; , 1]] &,
 Map[{#, {"DocumentType", "StyleDefinitions"} /. NotebookInformation[#]} &, #] &
  ][Notebooks[]]

But it is soo ugly :(

A:

Palettes have a specific window frame, so:
DeleteCases[Notebooks[], x_ /; MemberQ[Options[x], WindowFrame -> "Palette"]]

The Help seems to have a specific docked cell, so:
DeleteCases[Notebooks[], 
 x_ /; MemberQ[Options[x], DockedCells -> 
 FEPrivate`FrontEndResource["FEExpressions", "HelpViewerToolbar"]]]

So you can combine these two:
DeleteCases[Notebooks[], 
 x_ /; MemberQ[Options[x], 
   HoldPattern[_ -> 
     FEPrivate`FrontEndResource["FEExpressions", 
       "HelpViewerToolbar"] | "Palette"]]]

...and continuing along like this you should hopefully be able to find notebook options that are specific only to the sort of notebooks you want to exclude, and once identified use that as a way of excluding the notebook.

